0

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

1 回答 1

2

正如错误所说,as.a并且as.b不是有效的设备符号。as 一个设备符号,但结构本身的成员没有符号表条目,您不能直接cudaMemcpyToSymbol在它们上应用 a。

要解决此问题,请执行以下操作:

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)) );

[免责声明写在浏览器中,未经编译或测试,使用风险自负]

IE。仅复制完全初始化struct aStruct的符号,而不是尝试逐个复制成员。

于 2013-06-06T05:59:54.310 回答