'官方'CUDA缩减功能无法接受某些号码?

问题描述:

目前正试图用减少#3的轮廓在CUDA PDF here'官方'CUDA缩减功能无法接受某些号码?

这里是我的补偿功能的外观

template <typename T> 
__device__ void offsetReduction(planet<T> *bodies, T *outdata, int arrayIdent, int nbodies){ 
    extern __shared__ T sdata[]; 

    unsigned int tID = threadIdx.x; 
    unsigned int i = tID + blockIdx.x * blockDim.x; 

    if (arrayIdent == 1){ 
     if (i < nbodies){ 
      sdata[tID] = bodies[i].vx * bodies[i].mass; 
     } 

     __syncthreads(); 
    } 

    if (arrayIdent == 2){ 
     if (i < nbodies){ 
      sdata[tID] = (bodies[i].vy * bodies[i].mass); 
     } 
     __syncthreads(); 
    } 

    if (arrayIdent == 3){ 
     if (i < nbodies){ 
      sdata[tID] = (bodies[i].vz * bodies[i].mass); 
     } 
     __syncthreads(); 
    } 

    for (unsigned int stride = blockDim.x/2; stride > 0; stride >>=1) 
    { 
     if (tID < stride) 
     { 
      sdata[tID] += sdata[tID + stride]; 
     } 
     __syncthreads(); 
    } 

    if (tID == 0) 
    { 
     outdata[blockIdx.x] = sdata[0]; 
    } 

然而,它似乎并没有被正确地工作,所以我做了一些计算。

我推出同样数目的线程为“INT nbodies”,在我的情况下,我选择了5所以各5个线程的进来,并增加了一个值,SDATA []没有问题。然而,一旦它到达了附加部分,就会出错。

在第一次迭代线程0的访问SDATA [3],线程1的访问SDATA [4]和其它线程什么也不做。在第二次迭代中,线程0访问sdata 1,其他线程什么也不做。然后添加完成,内核完成。但sdata [2]永远不会被添加,所以我得到一个不正确的值存储在sdata [0]。

我缺少的东西真的很明显? (我一直在盯着这一段时间,所以我可能有

+1

问题寻求帮助调试“为什么这个代码不工作?”)必须包含所需的行为,特定的问题或错误以及在问题本身中重现问题所需的最短代码。没有明确问题陈述的问题对其他读者无益。请参阅:[如何创建最小,完整和可验证示例](http://stackoverflow.com/help/mcve)。 – Drop

+0

如减少任何树将只为每块两个线程 – talonmies

+0

@talonmies的功率工作,我在想,但我不知道,如果我只是缺少的东西。谢谢你清理那个。 –

这个简化代码,像任何其他“树状”减少操作一样,要求参与共享内存减少的线程数等于2电源才能正常工作。

注意,这意味着你可以设计减少内核这将通过具有2个线程最接近较小功率进行实际减少正常运行任何多每块2的线程你已经发布的代码不能,然而,工作像(