C++ 用于1D矩阵的2D GPU块

C++ 用于1D矩阵的2D GPU块,c++,cuda,gpgpu,C++,Cuda,Gpgpu,我是cuda编程的新手。我想实现大数组的向量加法。阵列的大小为100万。因为我无法创建100万个1d块。我曾想过制作1000x1000块,每个块中有一条螺纹 相关主代码 //Copy to GPU printf( "GPU\n" ); cudaMemcpy( dev_src1, src1, size * sizeof(int), cudaMemcpyHostToDevice ); cudaMemcpy( dev_src2, src2, size * sizeof(int), cudaMemcpy

我是cuda编程的新手。我想实现大数组的向量加法。阵列的大小为100万。因为我无法创建100万个1d块。我曾想过制作1000x1000块,每个块中有一条螺纹

相关主代码

//Copy to GPU
printf( "GPU\n" );
cudaMemcpy( dev_src1, src1, size * sizeof(int), cudaMemcpyHostToDevice );
cudaMemcpy( dev_src2, src2, size * sizeof(int), cudaMemcpyHostToDevice );

//Exec kernel
int nBlocks = ceil(sqrt(size));
int nThreadsPerBlock = 1;
addVector<<<dim3(nBlocks,nBlocks),nThreadsPerBlock>>>(dev_src1, dev_src2, dev_dest, size );

//Copy results to CPU
cudaMemcpy( dest, dev_dest, size * sizeof(int), cudaMemcpyDeviceToHost );

在当前场景中,您计算的
tid
不正确

如果每个块有1个线程,则
blockDim.x
将为1

tid
应计算为:

int tid = blockIdx.y * gridDim.x + blockIdx.x;
int tid = blockIdx.x * blockDim.x + threadIdx.x;
但是,我不建议为每个块创建一个线程并创建大量块。这显然是低效的,因为内核占用率将非常低

推荐的方法是创建一个足够大的块,例如每个块128或256个线程,然后创建一个足够大的网格来覆盖整个数据

例如:

int nThreadsPerBlock = 256;
int nBlocks = (size + nThreadsPerBlock - 1)/nThreadsPerBlock;
采用这种方法,
tid
将计算为:

int tid = blockIdx.y * gridDim.x + blockIdx.x;
int tid = blockIdx.x * blockDim.x + threadIdx.x;

为什么每个块有一个线程?那几乎浪费了你GPU的所有计算能力。好吧,可能是我的错。在我的情况下,请你建议一个更好的配置并实现它。什么是有效的和为什么你“没有得到正确的结果”是两个独立的问题。也许先关注后者。你能编辑你的问题来解释你得到了什么结果,并在你的代码中包含错误检查来确认内核是否真的在运行吗?对于错误检查,你可能需要阅读。我已经确认内核工作正常。我可以成功运行cuda-examples。是的,我知道每个块1个线程是一个错误的选择。我正在努力掌握blockDim、threadIdx等的用法。。你也能给我指一个资源,给我一个清晰的解释吗?最好的选择是通读这本书。是的,我也在读同样的书。但他却不厌其烦地去探索东西。无论如何,谢谢你的帮助。@mkuse。。。另一个很好的资源是在线课程。注册课程并下载讲座幻灯片和视频讲座。这门课程非常有益。