'官方'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]。
我缺少的东西真的很明显? (我一直在盯着这一段时间,所以我可能有
答
这个简化代码,像任何其他“树状”减少操作一样,要求参与共享内存减少的线程数等于2电源才能正常工作。
注意,这意味着你可以设计减少内核这将通过具有2个线程最接近较小功率进行实际减少正常运行任何多每块2的线程你已经发布的代码不能,然而,工作像(
问题寻求帮助调试“为什么这个代码不工作?”)必须包含所需的行为,特定的问题或错误以及在问题本身中重现问题所需的最短代码。没有明确问题陈述的问题对其他读者无益。请参阅:[如何创建最小,完整和可验证示例](http://stackoverflow.com/help/mcve)。 – Drop
如减少任何树将只为每块两个线程 – talonmies
@talonmies的功率工作,我在想,但我不知道,如果我只是缺少的东西。谢谢你清理那个。 –