我试图以这种方式将结构复制到常量内存:
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 %d\n", cData.a, cData.b, cData.c); // 1 2 3
}
但后来我尝试使用const char *
符号名称,事情停止了:
cudaMemcpyToSymbol("cData", &hData, 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 *));