CUDA动态共享内存没有获得价值

时间:2012-11-05 07:36:00

标签: cuda

问题是:

共享数组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 ); 

有人可以指出问题可能出在哪里吗?

1 个答案:

答案 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;