我尝试将结构数组传递给常量内存,但我遇到了同样的问题。首先,我的结构是:
#define point_size 1024
struct Point {
short x;
short y;
Point (short xx, short yy){
x = xx;
y = yy;
}
Point (){
x = 0;
y = 0;
}
};
当我使用以下声明时,出现编译错误:无法为设备上的非空构造函数或析构函数生成代码
__constant__ Point points_once[point_size];
奇怪的一面是,当我使用以下声明时,它消失了。但是,这对我来说无效。
__constant__ Point *points_once[point_size];
我该如何解决这个问题。感谢您的帮助。 我使用最新的驱动程序和带有compute_30和sm_30配置的Visual Studio 2010。
最佳答案
这个问题本质上是 this one 的重复。 。请查看那里的答案以解释为什么会发生这种情况。
作为解决方法,您可以使用直接赋值的已定义常量(即不在构造函数中),如其他答案中所述,或者您可以简单地省略构造函数初始化,并使用单独的基于主机的例程来初始化使用 cudaMemcpyToSymbol 包含您想要的值的__constant__
区域。
由于指针数组实际上并不分配结构存储,因此在第二个示例中不会调用构造函数,并且没有问题,因此您不会看到错误消息。
关于c - 在 CUDA 中使用常量内存和结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16099060/