Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cuda &引用;无效的设备符号“;对于作为结构字段的指针_Cuda - Fatal编程技术网

Cuda &引用;无效的设备符号“;对于作为结构字段的指针

Cuda &引用;无效的设备符号“;对于作为结构字段的指针,cuda,Cuda,我有下面显示的代码片段。对“cudaMemcpyToSymbol”的两个调用本质上是相同的(对dev_a、dev_b的所有操作也是相同的),但是当我运行代码时,它只报告了对“cudaMemcpyToSymbol”的第二个调用的“无效设备符号”错误。如果我删除了它,那么代码运行时没有任何问题。有人知道原因是什么吗?谢谢 struct aStruct { double *a; double *b; }; __device__ struct aStruct as; int main(voi

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

正如错误所说,
as.a
as.b
不是有效的设备符号
as
是一个设备符号,但结构本身的成员没有符号表条目,因此不能直接在其上应用
CudamCpYToSymbol

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

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
符号,而不是一个成员一个成员地复制。

太好了,可以了!谢谢。有一个后续问题,如果我以后想将say作为.a传递给内核启动,我应该怎么做?我是否必须使用整个结构的“cudaMemcpyFromSymbol”来承载并传递第一个字段?如果“as”也是另一个结构中的字段呢?我必须一个接一个地做吗?我从以前的文章中读到,不建议使用多级间接寻址,但我的应用程序需要它。有没有简单的方法来解决这个问题?谢谢。如果
as
在编译单元范围内被声明为
\uuuu设备\uuuu
变量,则不需要将其作为内核传递,可以直接从代码内部访问它。如果确实需要将结构从主机传递到内核,请将
\u作为
传递,如我的示例代码中所示。此外,如果这个答案解决了你的问题,你可以考虑接受它,它将它从未回答的队列中删除。谢谢你的快速响应。我是stackoverflow的新手,不知道“规则”。我已经接受了答案。至于后续问题,多亏了你的建议,我想我现在找到了解决的办法。