Cuda 并行化简例

Cuda 并行化简例,cuda,shared-memory,reduction,Cuda,Shared Memory,Reduction,我从斯坦福大学找到了使用共享内存的并行简化代码 该代码是1//启动单个块以计算部分和之和的示例 块和 此代码导致错误 假设numblocks是13 那么在内核块dim.x/2将是6, 及 if(threadIdx.x

我从斯坦福大学找到了使用共享内存的并行简化代码

该代码是1
//启动单个块以计算部分和之和的示例
块和
此代码导致错误

假设numblocks是13

那么在内核块dim.x/2将是6, 及

if(threadIdx.x
将只添加导致错误的前12个元素


当元素计数为200000或250000时,num_块将是奇数并导致错误,对于偶数num_块,它将正常工作

此内核对内核的阻塞参数(网格和线程块大小)敏感。您是否使用足够的线程来调用它以覆盖输入大小

使用for循环来表述这样的内核更为健壮,而不是:

unsigned int i = blockIdx.x * blockDim.x + threadIdx.x;
比如:

for ( size_t i = blockIdx.x*blockDim.x + threadIdx.x;
      i < N;
      i += blockDim.x*gridDim.x ) {
    sum += in[i];
}
for(size\u t i=blockIdx.x*blockDim.x+threadIdx.x;
i
CUDA手册中的源代码有很多“阻塞不可知论”代码的示例。还原代码如下所示:


谢谢您的回复。我试着只使用产生偶数个块的元素数来测试它,但与宿主结果相比,我仍然不能得到正确的结果。我的观察结果是,这个示例不仅需要偶数个块,还需要块大小%num\u blocks=0。对此有何评论?我对第二次内核发布表示怀疑,您是否验证了第一次内核发布的输出?您如何满足剩余部分的需求?感谢您的参与。我在原始帖子中引用的程序在调用所需的线程和线程块时没有问题。块大小为512,这是我的gpu计算能力1.3的最大值。如果块的数量不是2的幂,看起来会有问题。另外,如果我的输入大小导致计算的块的数量大于512,则会有问题,这将用作第二次内核调用的块大小。在您向我指出的cuda精简档案中,您是否考虑过我可以使用哪种输入大小来处理307200个输入大小,该输入大小使用600个块,每个块使用512个线程?
unsigned int i = blockIdx.x * blockDim.x + threadIdx.x;
for ( size_t i = blockIdx.x*blockDim.x + threadIdx.x;
      i < N;
      i += blockDim.x*gridDim.x ) {
    sum += in[i];
}