cudaMemcpyToSymbol使用或不使用字符串

Aki*_*oss 3 c c++ cuda

我试图以这种方式将结构复制到常量内存:

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

__constant__ Foo cData;

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

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

__global__ void kernel() {
    printf("Data is: %d %d %d\n", cData.a, cData.b, cData.c); // 1 2 3
}
Run Code Online (Sandbox Code Playgroud)

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

cudaMemcpyToSymbol("cData", &hData, sizeof(Foo)); // prints 0 0 0
Run Code Online (Sandbox Code Playgroud)

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

怎么了?

编辑:我想用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 *));
Run Code Online (Sandbox Code Playgroud)

Rob*_*lla 11

从CUDA 5开始,不再支持使用字符串作为符号名称.这是包括在CUDA 5发布说明这里

•不再支持使用字符串来表示某些API函数可能出现的设备符号.相反,应该直接使用该符号.

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