我有以下所示的代码段。对“cudaMemcpyToSymbol”的两次调用基本相同(对dev_a,dev_b的所有操作也是相同的),但是当我运行代码时,它仅在第二次调用“cudaMemcpyToSymbol”时报告“无效设备符号”错误。如果我删除它,那么代码运行没有任何问题。有谁知道可能是什么原因?感谢。
struct aStruct {
double *a;
double *b;
};
__device__ struct aStruct as;
int main(void) {
double *dev_a, *dev_b;
HANDLE_ERROR( cudaMalloc( (void**)&dev_a, N * sizeof(double) ) );
HANDLE_ERROR( cudaMalloc( (void**)&dev_b, N * sizeof(double) ) );
...
HANDLE_ERROR( cudaMemcpyToSymbol(as.a, &dev_a, sizeof(double *)) );
HANDLE_ERROR( cudaMemcpyToSymbol(as.b, &dev_b, sizeof(double *)) );
....
}
答案 0 :(得分:2)
正如错误所述,as.a
和as.b
不是有效的设备符号。 as
是设备符号,但结构成员本身没有符号表条目,您无法直接在其上应用cudaMemcpyToSymbol
。
要解决此问题,请执行以下操作:
struct aStruct _as;
HANDLE_ERROR( cudaMalloc( (void**)&_as.a, N * sizeof(double) ) );
HANDLE_ERROR( cudaMalloc( (void**)&_as.b, N * sizeof(double) ) );
HANDLE_ERROR( cudaMemcpyToSymbol(as, &_as, sizeof(struct aStruct)) );
[免责声明在浏览器中编写,未编译或测试,使用风险自负]
即。仅复制完全初始化的struct aStruct
符号,而不是尝试按成员复制成员。