怎么样才能申请一个全局变量呢

怎么样能申请一个存在于设备上的全局变量呢?
比如在函数外或头文件中声明extern constant int d;
然后在主函数中对其进行内存分配和赋值。
int dd=9;
cudaMalloc((void
*)&d,sizeof(int));
cudaMemcpyToSymbol(d,&dd,sizeof(int),size_t(0),cudaMemcpyHostToDevice);

这样debug发现d的值不对啊~是“???”

楼主您太幽默了:

您可以直接__constant__ int d;即可。
然后您就可以直接cudaMemcpyToSymbol了。

如果您想将定义放在另外一个.cu里面,而在头文件里声明成extern的给多个.cu用,则您需要使用-rdc=true选项。

感谢您的来访。

版主,您的意思是不是:
在main函数外 constant int d;
main函数里直接cudaMemcpyToSymbol(&d,&dd,sizeof(int),size_t(0),cudaMemcpyHostToDevice);
不需要内存分配?
但是我试过了,kernel函数里数值还是不对啊

LZ您好:

cudaMemcpyToSymbol(d,&dd,sizeof(int),0,cudaMemcpyHostToDevice);

不需要重新分配了,因为你已经有一个变量了。
您之前的做法是搞混了__constant__全局变量申请,和申请一个__constant__的指针指向global memory中分配的变量这两种做法。

后面这种做法可以使用__constant__的指针指向动态分配的一段global memory缓冲区,programming guide中有这种做法。

大致如此,祝您好运~

测试过了,果然有效,之前之所以会是&d,是因为只输入d时会提示有错误,是什么实参与形参不兼容,但是按版主的方法可以编译通过,困扰我好久解决了,谢谢版主

感谢您的来访,祝您周末愉快。

版主,这个-rdc在哪里啊?新手,不要见笑啊

嗯嗯,你说的情况没错,但是这里确实不需要添加&,因为此处是特殊处理的,所有“ToSymbol”和“FromSymbol”函数里面的参数“symbol”都是直接写就可以。

祝您编码顺利~

嗯嗯,再次感谢版主

您可以参考如下讨论帖:

http://cudazone.nvidia.cn/forum/forum.php?mod=viewthread&tid=6344&page=1

http://cudazone.nvidia.cn/forum/forum.php?mod=viewthread&tid=7150

祝您好运~