linux – CUDA C v.推特,我错过了什么吗?
发布时间:2020-12-14 00:53:03 所属栏目:Linux 来源:网络整理
导读:我刚开始学习CUDA编程.我正在浏览一些简单的CUDA C示例,一切都在游动.然后!突然!推力!我认为自己精通C仿函数,并对CUDA C和Thrust之间的区别感到吃惊 我觉得很难相信 __global__ void square(float *a,int N) { int idx = blockIdx.x * blockDim.x + threa
我刚开始学习CUDA编程.我正在浏览一些简单的CUDA C示例,一切都在游动.然后!突然!推力!我认为自己精通C仿函数,并对CUDA C和Thrust之间的区别感到吃惊
我觉得很难相信 __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,cudaMemcpyDeviceToHost); for (int i = 0; i < N; i++) { printf("%d,%fn",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(),std::ostream_iterator<float>(std::cout,"n")); } 我错过了什么吗?上面的代码是在GPU上运行的吗? Thrust是一个很好的工具,但我怀疑它会处理所有繁重的C风格的内存管理. > Thrust代码是否在GPU上执行?我该怎么说? 谢谢你的时间.对不起,如果这些都是愚蠢的问题,但我发现我看到的例子很快就从可以被描述为Model T转变为M3. 解决方法
大概:是的,当然. Thrust是一个图书馆,所以它们都是为了让它变得更容易而诞生的.它的重点在于避免使用所有显式的CUDA代码,这对于其他程序员来说看起来很奇怪,提供了一个友好的类C接口.
Thrust使用GPU,但不仅仅是GPU.如果您编写自己的代码,它会进行相同的操作,即用于分配内存,复制,设置网格和块大小的C/C++代码……然后调用GPU执行内核. 对于那些不想进入低级CUDA内容但是在一个简单(但频繁)的问题中利用GPU并行性的人来说,这是一个很好的选择,比如矢量操作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |