2012-11-05 43 views
0

的问题是:CUDA动态共享存储器没有得到值

共享阵列perBlockMsg[i]保持等于0的所有值,但预计将十进制值大于0作为d_msg[]具有的值越大。 d_msg[] ia是一个二维数组,我已将其平面化为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

你可能会从这次讨论一些帮助。 http://stackoverflow.com/questions/11900394/cuda-shared-memory-issue-in-outputs-depending-on-extern-declaration-and-size-of –

+0

我保持你提到的帖子的建议我的上面的代码,但仍然不工作...这就是为什么我发布它... – Shohidul

+0

不代表这行代码意味着你只会得到1,0或负数:if(d_msg [i * gridDim.x + j] <= 1)也许这应该是一个大于或等于测试? –

回答

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;