从旧的CUDA版本更新项目

时间:2014-08-18 21:59:08

标签: cuda

在我较旧的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))

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

1 个答案:

答案 0 :(得分:2)

从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
$