Cuda &引用;无效的设备符号“;对于作为结构字段的指针
我有下面显示的代码片段。对“cudaMemcpyToSymbol”的两个调用本质上是相同的(对dev_a、dev_b的所有操作也是相同的),但是当我运行代码时,它只报告了对“cudaMemcpyToSymbol”的第二个调用的“无效设备符号”错误。如果我删除了它,那么代码运行时没有任何问题。有人知道原因是什么吗?谢谢Cuda &引用;无效的设备符号“;对于作为结构字段的指针,cuda,Cuda,我有下面显示的代码片段。对“cudaMemcpyToSymbol”的两个调用本质上是相同的(对dev_a、dev_b的所有操作也是相同的),但是当我运行代码时,它只报告了对“cudaMemcpyToSymbol”的第二个调用的“无效设备符号”错误。如果我删除了它,那么代码运行时没有任何问题。有人知道原因是什么吗?谢谢 struct aStruct { double *a; double *b; }; __device__ struct aStruct as; int main(voi
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的新手,不知道“规则”。我已经接受了答案。至于后续问题,多亏了你的建议,我想我现在找到了解决的办法。