【问题标题】:Update project from older CUDA version从旧 CUDA 版本更新项目
【发布时间】:2014-08-19 06:33:08
【问题描述】:

在我较早的 CUDA 项目中,我有全局变量:

__device__ uint8_t dev_intersect
__constant__ uint8_t dev_flags

...并以这种方式使用它们:

cudaGetSymbolAddress((void**)&ptr_dev_intersect,"dev_intersect")
cudaMemcpyToSymbol("dev_flags",&flags,sizeof(flags))

现在,由于 CUDA 5.0(和更高版本)必须直接传递符号(不带字符串),所以我这样定义全局变量:

__device__ uint8_t *dev_intersect
__constant__ uint8_t *dev_flags

...并以这种方式调用函数:

cudaGetSymbolAddress((void**)&ptr_dev_intersect,dev_intersect)
cudaMemcpyToSymbol(dev_flags,&flags,sizeof(flags))

到目前为止,我做得对吗?我在问你,因为当我更新代码时,我开始收到其他错误,这让我有点怀疑。谢谢你的帮助。

【问题讨论】:

    标签: cuda


    【解决方案1】:

    从 POD 变量切换到指针可能不是您想要的。

    如果您没有在代码的其他地方进行更改以解决该差异,我预计会出现问题。

    要更新您的 cuda 函数调用,请保持您的变量不变:

    __device__ uint8_t dev_intersect;
    __constant__ uint8_t dev_flags;
    

    只需从使用这些变量的 cuda API 函数中删除引号:

    cudaGetSymbolAddress((void**)&ptr_dev_intersect,dev_intersect);
    cudaMemcpyToSymbol(dev_flags,&flags,sizeof(flags));
    

    这是一个完整的工作示例:

    $ cat t524.cu
    #include <stdio.h>
    typedef unsigned char uint8_t;
    
    __device__ uint8_t dev_intersect;
    __constant__ uint8_t dev_flags;
    
    __global__ void mykernel(uint8_t *d1_ptr){
    
      printf("data 1 = %c\n", *d1_ptr);
      printf("dev_flags = %c\n", dev_flags);
    
    }
    
    int main(){
    
      uint8_t *ptr_dev_intersect;
      uint8_t flags = 'X';
      uint8_t dev_intersect_data = 'Y';
    
      cudaGetSymbolAddress((void**)&ptr_dev_intersect,dev_intersect);
      cudaMemcpyToSymbol(dev_flags,&flags,sizeof(flags));
      cudaMemcpyToSymbol(dev_intersect,&dev_intersect_data,sizeof(dev_intersect_data));
    
      mykernel<<<1,1>>>(ptr_dev_intersect);
      cudaDeviceSynchronize();
      return 0;
    }
    
    $ nvcc -arch=sm_20 -o t524 t524.cu
    $ cuda-memcheck ./t524
    ========= CUDA-MEMCHECK
    data 1 = Y
    dev_flags = X
    ========= ERROR SUMMARY: 0 errors
    $
    

    【讨论】:

    • 程序运行,但出现“无效设备符号错误”,编译器在两个变量下划线。
    • 我相信这是一个单独的问题。如果您需要有关无效设备符号错误的帮助,请编写一个新问题并提供演示该错误的完整代码。如果您想证明我的答案是正确的,我已经在我的答案中添加了一个完整的工作示例。
    • 感谢您的示例。实际上程序运行良好,只是永久的“无效设备符号”消息困扰着我。我要么不注意,要么今天晚些时候尝试缩小问题范围。
    • 无效的设备符号消息肯定是个问题。这不是可以安全忽略的事情。编译器下划线可能是智能感知/CUDA 问题,而不是代表“真正”问题的东西。但如果没有具体的例子,就无法确定。
    • 我忽略了代码的某些部分中的引号。现在,当我删除它们时,它不再抱怨了。再次感谢。在这个网站上帮助像你这样的人感觉很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    相关资源
    最近更新 更多