【问题标题】:Load structure in gpu shared memorygpu共享内存中的加载结构
【发布时间】:2013-03-18 16:09:34
【问题描述】:

我正在处理一个结构数组,每个 cuda 块将使用一个结构(并且只有一个)的数据并围绕它进行大量计算。为了让程序正常工作,我想将结构加载到共享内存中。

我尝试过使用这样的 memcpy 函数:

struct LABEL_2D{
    int a;
    float * b[MAX];
};




__shared__ struct LABEL_2D self_label;

if(threadIdx.x == 0){
memcpy(&self_label,
           label+(blockIdx.x*sizeof(struct LABEL_2D)),
           sizeof(struct LABEL_2D));
}
 __syncthreads();

但在执行时出现以下错误:未指定的启动失败 cudaGetLastError()

我想知道是否可以在共享内存中加载结构。

【问题讨论】:

    标签: cuda shared-memory


    【解决方案1】:

    您不应该使用 memcpy() 复制数据。

    您可以像以前一样分配第一个线程,以简单地初始化一个共享内存变量:

    struct LABEL_2D{
        int a;
        float * b[MAX];
    };
    
    
    __shared__ LABEL_2D self_label;
    
    if(threadIdx.x == 0){
        slef_label = label[blockIdx.x];
    
    }
     __syncthreads();
    

    编辑:删除了其他解决方法,因为它们实际上没用。

    【讨论】:

    • label[blockIdx.x] 分配给一个局部变量会有很大不同的行为(例如,使用本地而不是共享内存,只在调用线程中可见,可能溢出到 gmem 等),所以我不会等同于两种方法。
    • @RobertCrovella 是的,它们是不同的,我只是想提一下这种方式也存在。我会在回答中提到这一点,谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    相关资源
    最近更新 更多