问题是:
共享数组perBlockMsg[i]
包含所有等于0的值,但由于d_msg[]
具有值,因此预计它将是大于0的十进制值。 d_msg[]
我是一个2D数组,我把它压平为1D并确保它的数据成功传递到设备。
__global__ void add( int *d_msg, int *d_checkSumArray) {
int i=threadIdx.x;
int j=blockIdx.x;
extern __shared__ int perBlockMsg[];
if(d_msg[i* gridDim.x + j]<=1)
{
perBlockMsg[i]=d_msg[i* gridDim.x + j];
}
__syncthreads();
if(j==2 && i<=gridDim.x) //here i is the row number
{
d_checkSumArray[i]=perBlockMsg[i];
}
}
内核调用如下(其中)M = 7,R = 4,这两个变量也是动态的
add<<<R,(M+R), (M+R)* sizeof(int)>>>( d_msg, d_checkSumArray );
有人可以指出问题可能出在哪里吗?
答案 0 :(得分:1)
提供答案,将其从未答复的清单中删除。
代码中发现的主要问题是此测试:
if(d_msg[i* gridDim.x + j]<=1)
不正确,应该是这样的:
if(d_msg[i* gridDim.x + j]>=1)
捕获“大于0的十进制值”,如问题中所示。
此外,documentation共享变量也涵盖了后续问题。
一种方法是使用单个动态分配(指针)处理所有共享变量:
extern __shared__ int perBlockMsg[];
int *msgLength = perBlockMsg + perBlockMsgLength;