问题是:
共享数组perBlockMsg[i]保存的所有值都等于0,但由于d_msg[]具有这些值,因此它应该是大于0的十进制值。d_msg[]是一个二维数组,我已经将它展平到一维,并确保它的数据成功地传递到设备中。
__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 ); 有人能指出问题出在哪里吗?
发布于 2014-08-19 00:24:57
提供一个答案,将其从未应答列表中删除。
在代码中发现的主要问题是这个测试:
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;https://stackoverflow.com/questions/13227842
复制相似问题