加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – cudaMemcpyToSymbol使用或不使用字符串

发布时间:2020-12-16 10:23:56 所属栏目:百科 来源:网络整理
导读:我试图以这种方式将结构复制到常量内存: struct Foo { int a,b,c;};__constant__ Foo cData;int main() { Foo hData = {1,2,3}; cudaMemcpyToSymbol(cData,hData,sizeof(Foo)); // ...} 这工作正常,在我的内核中我可以直接访问常量数据: __global__ void k
我试图以这种方式将结构复制到常量内存:

struct Foo {
    int a,b,c;
};

__constant__ Foo cData;

int main() {
    Foo hData = {1,2,3};
    cudaMemcpyToSymbol(cData,&hData,sizeof(Foo));
    // ...
}

这工作正常,在我的内核中我可以直接访问常量数据:

__global__ void kernel() {
    printf("Data is: %d %d %dn",cData.a,cData.b,cData.c); // 1 2 3
}

但后来我尝试使用const char *作为符号名称,事情停止了:

cudaMemcpyToSymbol("cData",sizeof(Foo)); // prints 0 0 0

我认为两个版本都相似,但似乎我错了.

怎么了?

编辑:
我想用cudaGetSymbolAddress报告这个相同的行为,如果没有使用const char *,它对我有用:

__constant__ int someData[10];
__constant__ int *ptrToData;

int *dataPosition;
cudaGetSymbolAddress((void **)&dataPosition,someData); // Works
// cudaGetSymbolAddress((void **)&dataPosition,"someData"); // Do not work
cudaMemcpyToSymbol(ptrToData,&dataPosition,sizeof(int *));

解决方法

从CUDA 5开始,不再支持使用字符串作为符号名称.这在CUDA 5发行说明 here中有所介绍

?The use of a character string to indicate a device symbol,which was possible with certain API functions,is no longer supported. Instead,the symbol should be used directly.

其中一个原因与启用真正的设备链接器有关,这是CUDA 5中的新功能.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读