我试图以这种方式将结构复制到常量内存:
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)