【发布时间】:2012-04-13 17:58:45
【问题描述】:
CUDA 中的__shared__ 内存似乎在编译时需要一个已知的大小。但是,在我的问题中,__shared__ 内存大小仅在运行时知道,即
int size=get_size();
__shared__ mem[size];
这会以“错误:常量值未知”结束,我不知道如何解决这个问题。
【问题讨论】:
-
allocating shared memory 的可能重复项
CUDA 中的__shared__ 内存似乎在编译时需要一个已知的大小。但是,在我的问题中,__shared__ 内存大小仅在运行时知道,即
int size=get_size();
__shared__ mem[size];
这会以“错误:常量值未知”结束,我不知道如何解决这个问题。
【问题讨论】:
共享内存的目的是允许块中的线程进行协作。当您将数组声明为 __shared__ 时,块中的每个线程都会看到相同的内存,因此给定线程能够为共享内存中的数组设置自己的大小是没有意义的。
但是,支持动态指定单个 __shared__ 数组大小的特殊情况,该数组对于所有线程的大小都相同。见allocating shared memory。
如果您确实需要为每个线程动态分配内存,您可以在内核中使用 new 或 malloc(在 Fermi 上),但它们会分配全局内存,这可能会很慢。
【讨论】:
您应该使用extern__shared__ mem[];(动态共享内存)而不是__shared__ mem[size];(静态共享内存)。见 [https://devblogs.nvidia.com/parallelforall/using-shared-memory-cuda-cc/][1]
【讨论】: