首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CUDA动态共享内存未获取值

CUDA动态共享内存未获取值
EN

Stack Overflow用户
提问于 2012-11-05 15:36:00
回答 1查看 312关注 0票数 0

问题是:

共享数组perBlockMsg[i]保存的所有值都等于0,但由于d_msg[]具有这些值,因此它应该是大于0的十进制值。d_msg[]是一个二维数组,我已经将它展平到一维,并确保它的数据成功地传递到设备中。

代码语言:javascript
复制
__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和这两个变量也是动态的

代码语言:javascript
复制
add<<<R,(M+R), (M+R)* sizeof(int)>>>( d_msg, d_checkSumArray ); 

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

EN

回答 1

Stack Overflow用户

发布于 2014-08-19 00:24:57

提供一个答案,将其从未应答列表中删除。

在代码中发现的主要问题是这个测试:

代码语言:javascript
复制
if(d_msg[i* gridDim.x + j]<=1)

是不正确的,应该是这样的:

代码语言:javascript
复制
if(d_msg[i* gridDim.x + j]>=1)

捕获问题中指出的“大于0的十进制值”。

此外,后续问题在共享变量的documentation中也有介绍。

一种方法是使用单个动态分配(指针)处理所有共享变量:

代码语言:javascript
复制
extern  __shared__ int perBlockMsg[];
int *msgLength = perBlockMsg + perBlockMsgLength;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13227842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档