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

如何定义运行时已知大小的CUDA共享内存?,cuda,gpu-shared-memory,Cuda,Gpu Shared Memory,CUDA中的\uuuuu共享\uuuuu内存在编译时似乎需要一个已知的大小。然而,在我的问题中,\uuuuuuuuuuuuuuuuuuuuuuuuuuu共享的内存大小只在运行时知道,即 int size=get_size(); __shared__ mem[size]; 这将以“错误:常量值未知”结束,我不确定如何解决这个问题。共享内存的目的是允许块中的线程协作。当您将一个数组声明为\uuuuuu shared\uuuuu时,块中的每个线程都会看到相同的内存,因此给定的线程无法为共享内存中的数

CUDA中的
\uuuuu共享\uuuuu
内存在编译时似乎需要一个已知的大小。然而,在我的问题中,
\uuuuuuuuuuuuuuuuuuuuuuuuuuu共享的
内存大小只在运行时知道,即

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

这将以“错误:常量值未知”结束,我不确定如何解决这个问题。

共享内存的目的是允许块中的线程协作。当您将一个数组声明为
\uuuuuu shared\uuuuu
时,块中的每个线程都会看到相同的内存,因此给定的线程无法为共享内存中的数组设置自己的大小

但是,支持动态指定所有线程大小相同的单个
\uuuuuuuuuuuuuuuuuuuuuuuuuu共享\uuuuuuuuuuu
数组大小的特殊情况。看


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

您应该使用
extern\uuuuuuuuuuu shared\uuuuuuu mem[](动态共享内存)而不是
\uuuuuuuuuuuuuuuumem[size](静态共享内存)。请参见[

实际上,我正试图将blockDim.x作为共享内存大小,这对于同一块中的所有线程都是相同的,但仍然失败(尽管有一个不同的错误)@海良章:您可能不想通过动态改变块维度来解决问题。通常,您可以通过仔细考虑内核的资源使用情况并在此基础上设置固定的最佳块维度来获得最佳性能。例如,通过使用CUDA占用率计算器电子表格。此外,dimen为了获得最佳性能,sions应该乘以warp大小的倍数。您只能动态调整网格尺寸,以适应您的数据。@RogerDahl:这个答案不正确。您可以在运行时动态确定内核共享内存-这是CUDA自1.0以来的一项功能。有关如何调整,请参阅。@talonmies:啊,这就是myst的功能第三个论点是为了!活到老学到老…谢谢。我已经修正了答案。可能是重复的