"设备符号无效"对于作为结构字段的指针

时间:2013-06-06 03:59:21

标签: cuda

我有以下所示的代码段。对“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 *)) );
....
}

1 个答案:

答案 0 :(得分:2)

正如错误所述,as.aas.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符号,而不是尝试按成员复制成员。