我想在CUDA设备的__constant__
内存中初始化一个数组。直到运行时我才知道它的大小或值。
我知道我可以使用__constant__ float Points[**N**][2]
或类似的东西,但我如何使这种动态?也许是__constant__ float* Points
?
这可能吗?而且可能更重要的是,这是一个好主意吗?如果有更好的选择,这样做,我很乐意听到它们。
答案 0 :(得分:2)
正如Dynamic Allocation of Constant memory in CUDA和Constant memory allocation and initialization中所讨论的那样,你不能。正如Constant memory allocation and initialization中所注意到的那样,
常量在编译时嵌入到可执行文件中(这就是为什么你必须将字节复制到符号指定的地址以在运行时设置常量值)。因此,您将无法为同一编译内核的不同调用分配不同大小的常量数组。
Constant memory allocation and initialization中的建议是使用纹理内存,因为
可以动态设置纹理大小并缓存它们。
如果您使用的是Kepler,我的建议是按const __restrict
装饰数组指针。通过这种方式,您将能够动态分配数组,并且编译器将安排事物,以便在运行时通过纹理缓存自动读取数据。