在我较旧的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))
到目前为止我做得对吗?我问你,因为当我更新代码时,我开始得到其他错误,这让我有点怀疑。谢谢你的帮助。
答案 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
$