【发布时间】:2016-07-10 16:13:19
【问题描述】:
我正在编写一些 CUDA 代码以在设备上运行。该代码将使用两个常量值查找表。其中第一个是 256 个无符号整数的数组,我将其声明为:
__constant__
uint16_t edgeTable[256]={
0x000,
0x019,
... etc.
};
这似乎编译得很好。
第二个是dim3的固定大小数组,我试过这个:
__constant__
dim3 offsets[8] = {
{0, 0, 0}, {0, 0, 1}, {0, 1, 0},
... etc
};
编译器反对的对象。带有错误消息:
error: dynamic initialization is not supported for __device__, __constant__ and __shared__ variables.
也许我误解了动态初始化,但在我看来这是静态初始化,编译器可以计算出所有内容的大小并提供所有值。
我在这里错过了什么?
我怎样才能实现我想要做的事情?
谢谢
我在带有 gcc 4.8.4 的 Ubuntu 14.04 上使用 CUDA7.5 工具包
【问题讨论】:
-
可能是个愚蠢的问题——你是否传递了启用 C++11 的标志?
-
在 C++11 之前的 C++ 中不支持参数化构造函数初始化(dim3 是一个类)
-
也许你的问题的答案是,这实际上是动态初始化的一种形式(参见上面的 cmets),并且这些变量类型不支持动态初始化,正如编译器所指出的那样,无论 c ++11 编译器开关。作为一种可能的解决方法,您可以创建一个
int数组(__constant__ int的静态初始化),然后在内核代码中将其转换为dim3数组,可能类似于this。我认为您可能已经自己想出了这样的解决方法,所以,我并不是说这是一个答案。 -
卫生署!谢谢。我确实通过了 -std=c++11 但是完全没有考虑结构是一个类的事实,因此当然会被动态初始化。我认为@Robert Crovella 你的回答是我唯一能做的..
标签: struct cuda constants static-initialization