gpt4 book ai didi

linux - CUDA C v. Thrust,我错过了什么吗?

转载 作者:IT王子 更新时间:2023-10-29 01:09:42 26 4
gpt4 key购买 nike

我刚开始学习 CUDA 编程。我浏览了一些简单的 CUDA C 示例,一切进展顺利。然后!突然!推力!我认为自己精通 C++ 仿函数,并且对 CUDA CThrust

之间的区别感到吃惊

我觉得很难相信

__global__ void square(float *a, int N) {
int idx = blockIdx.x * blockDim.x + threadIdx.x;
if (idx < N) {
a[idx] = a[idx] * a[idx];
}
}

int main(int argc, char** argv) {

float *aHost, *aDevice;

const int N = 10;
size_t size = N * sizeof(float);

aHost = (float*)malloc(size);
cudaMalloc((void**)&aDevice, size);

for (int i = 0; i < N; i++) {
aHost[i] = (float)i;
}

cudaMemcpy(aDevice, aHost, size, cudaMemcpyHostToDevice);

int block = 4;
int nBlock = N/block + (N % block == 0 ? 0:1);

square<<<nBlock, block>>>(aDevice, N);

cudaMemcpy(aHost, aDevice, size, cudaMemcpyDeviceToHost);

for (int i = 0; i < N; i++) {
printf("%d, %f\n", i, aHost[i]);
}

free(aHost);
cudaFree(aDevice);
}

相当于

template <typename T>
struct square {
__host__ __device__ T operator()(const T& x) const {
return x * x;
}
};

int main(int argc, char** argv) {
const int N = 10;
thrust::device_vector<float> dVec(N);
thrust::sequence(dVec.begin(), dVec.end());
thrust::transform(dVec.begin(), dVec.end(), dVec.begin(), square<float>());
thrust::copy(dVec.begin(), dVec.end(), std::ostream_iterator<float>(std::cout, "\n"));
}

我错过了什么吗?上面的代码是在 GPU 上运行的吗? Thrust 是一个很棒的工具,但我怀疑它是否能处理所有繁重的 C 风格内存管理。

  • Thrust 代码是否在 GPU 上执行?我怎么知道?
  • Thrust 如何消除调用内核的奇怪语法?
  • Thrust 实际上是在唤起内核吗?
  • Thrust 是否自动处理线程索引计算?

感谢您的宝贵时间。很抱歉,如果这些问题很愚蠢,但我觉得难以置信的是,我所看到的示例会立即从可以描述为 Model T 的模型转变为 M3。

最佳答案

粗略地说:是的,当然。 Thrust 是一个图书馆,所有这些都是为了让它更容易而生。它的优点是避免了所有显式 CUDA 代码,这对其他程序员来说看起来很奇怪,提供了一个友好的类 C++ 接口(interface)。

Thrust 使用 GPU,但不只是 GPU。如果您编写自己的代码,它会执行相同的操作,即用于分配内存、复制、设置网格和 block 大小的 C/C++ 代码……然后调用 GPU 来执行内核。

对于那些不想深入了解低级 CUDA 内容但想在简单(但频繁)问题(如矢量运算)中利用 GPU 并行性的人来说,这是一个不错的选择。

关于linux - CUDA C v. Thrust,我错过了什么吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16858010/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com