CUDA中的共享内存未获得分配给它的值,总是打印零

CUDA中的共享内存未获得分配给它的值,总是打印零,cuda,shared-memory,reduction,Cuda,Shared Memory,Reduction,这个简单的简化功能可以在CUDA在线演示中找到 __device__ void reducedSum(double* d_idata, double* d_odata, long LENGTH) { extern __shared__ double sdata[]; unsigned int tid = threadIdx.x; unsigned int i = blockIdx.x * blockDim.x + threadIdx.x; if (i <

这个简单的简化功能可以在CUDA在线演示中找到

__device__ void reducedSum(double* d_idata, double* d_odata, long LENGTH)
{
    extern __shared__ double sdata[];
    unsigned int tid = threadIdx.x;
    unsigned int i = blockIdx.x * blockDim.x + threadIdx.x;

    if (i < LENGTH) {
        sdata[tid] = d_idata[i];
        __syncthreads();

        printf("Kernel sdata : %d \n", sdata[tid]);

        for (unsigned int s = 1; s < blockDim.x; s *= 2)
        {
            if (tid % (2 * s) == 0)
            {
                sdata[tid] += sdata[tid + s];
            }
            __syncthreads();

        }

        if (tid == 0) {
            d_odata[blockIdx.x] = sdata[0];
        }
    }
}
\uuuuu设备\uuuuu无效约化和(双*d\u数据,双*d\u数据,长)
{
外部共享双sdata[];
unsigned int tid=threadIdx.x;
无符号整数i=blockIdx.x*blockDim.x+threadIdx.x;
如果(i<长度){
sdata[tid]=d_idata[i];
__同步线程();
printf(“内核sdata:%d\n”,sdata[tid]);
for(无符号整数s=1;s
但是这里的printf总是打印以下输出。它实际要做的是从d_idata数组中复制值,并将其部分分配给每个共享内存块。然而,这并没有发生

对内核的调用如下所示:

long LENGTH = 10;
long N = 5;
int threadsPerBlock = N;
int numBlocks = (threadsPerBlock + LENGTH - 1) / threadsPerBlock;
cudaCalc<<<numBlocks, threadsPerBlock, N*sizeof(double)>>> (d_vec1, d_vec2, d_dotProduct, ....)
long-LENGTH=10;
长N=5;
int threadsPerBlock=N;
int numBlocks=(threadsPerBlock+长度-1)/threadsPerBlock;
cudaCalc(d_vec1、d_vec2、d_dotProduct等)
现在在内核中,我调用这个reducedSum _设备_函数,如下所示

__global__ void cudaCalc(int* d_vec1, int* d_vec2, double* d_dotProduct, ... )
{
    int tid_0 = threadIdx.x;
    int index = blockDim.x * blockIdx.x + threadIdx.x;
    if (index < LENGTH) {
        d_dotProduct[index] = (double) d_vec1[index] * d_vec2[index];
        d_squared1[index] = (double)d_vec1[index] * d_vec1[index];
        d_squared2[index] = (double)d_vec2[index] * d_vec2[index];
        __syncthreads();
    }

    reducedSum(d_squared1, d_squaredSum1, LENGTH);
    reducedSum(d_squared2, d_squaredSum2, LENGTH);
    reducedSum(d_dotProduct, d_dotSum, LENGTH);

}
\uuuuu全局\uuuuu无效cudaCalc(int*d\u vec1,int*d\u vec2,double*d\u dotProduct,…)
{
int tid_0=threadIdx.x;
int index=blockDim.x*blockIdx.x+threadIdx.x;
如果(索引<长度){
d_点积[索引]=(双)d_向量1[索引]*d_向量2[索引];
d_平方1[指数]=(双)d_向量1[指数]*d_向量1[指数];
d_平方d2[index]=(双)d_向量2[index]*d_向量2[index];
__同步线程();
}
约化和(d_平方d1,d_平方sum1,长度);
约化和(d_平方D2,d_平方SUM2,长度);
约化和(d_点积,d_点和,长度);
}

请一些好的先生/女士告诉我哪里错了?我已经做了好几个小时了。如果您想查看代码的其余部分,请请求。提前感谢。

故障在于printf功能。真不敢相信我花了几个小时在这上面

printf("Kernel sdata : %d \n", sdata[tid]);
占位符用于整数,而sdata是双数组。问题解决了


nvcc编译器对于此类错误不会显示警告或错误,这实在是太糟糕了。另一方面,gcc显示了如此多的警告。这应该是一个建议

请记住几天后再来接受您的回答,这样这个问题就不会出现在CUDA标签的未回答队列中