如何定义运行时已知大小的CUDA共享内存?

时间:2012-03-30 02:51:53

标签: cuda gpu-shared-memory

CUDA中的__shared__内存在编译时似乎需要已知大小。但是,在我的问题中,__shared__内存大小只能在运行时知道,即

int size=get_size();
__shared__ mem[size];

最终会出现“错误:常量值未知”,我不知道如何解决这个问题。

2 个答案:

答案 0 :(得分:5)

共享内存的目的是允许块中的线程进行协作。当您将数组声明为__shared__时,块中的每个线程都会看到相同的内存,因此给定的线程能够为共享内存中的数组设置自己的大小是没有意义的。

但是,动态指定单个__shared__数组大小的特殊情况是支持所有线程的大小相同。请参阅allocating shared memory

如果你确实需要为每个线程动态分配内存,你可以在内核中使用new或malloc(在Fermi上),但是它们分配全局内存,这可能很慢。

答案 1 :(得分:1)

您应该使用extern__shared__ mem[];(动态共享内存)而不是__shared__ mem[size];(静态共享内存)。见[https://devblogs.nvidia.com/parallelforall/using-shared-memory-cuda-cc/][1]