18

在当今大多数 nVIDIA GPU 上,共享内存(OpenCL 术语中的“本地内存”)的大小仅为 16 KiB。
我有一个应用程序,我需要在其中创建一个包含 10,000 个整数的数组。所以我需要容纳 10,000 个整数 = 10,000 * 4b = 40kb 的内存量。

  • 我该如何解决这个问题?
  • 是否有任何 GPU 具有超过 16 KiB 的共享内存?
4

3 回答 3

26

将共享内存视为显式管理的缓存。您需要将数组存储在全局内存中,并根据需要将其部分缓存在共享内存中,方法是进行多次传递或其他一些方案,以最大限度地减少加载和存储到/来自全局内存的数量。

你如何实现这将取决于你的算法——如果你能给出一些你正在尝试实现的细节,你可能会得到一些更具体的建议。

最后一点 - 请注意共享内存在块中的所有线程之间共享- 每个线程的内存少于 16 kb,除非您有一个块中所有线程共有的单一数据结构。

于 2011-02-13T11:30:56.123 回答
9

所有计算能力 2.0 及更高版本的设备(大多数在过去一两年内)每个多处理器都有 48KB 的可用共享内存。话虽如此,Paul 的回答是正确的,因为您可能不想将所有 10K 整数加载到单个多处理器中。

于 2012-04-26T23:21:07.107 回答
4

您可以尝试使用cudaFuncSetCacheConfig(nameOfKernel, cudaFuncCachePrefer{Shared, L1})功能。

如果您更喜欢 L1 而不是 Shared,那么 48KB 将转到 L1,16KB 将转到 Shared。如果您更喜欢共享而不是 L1,则 48KB 将进入共享,16KB 将进入 L1。

用法:

cudaFuncSetCacheConfig(matrix_multiplication, cudaFuncCachePreferShared);
matrix_multiplication<<<bla, bla>>>(bla, bla, bla); 
于 2014-04-12T21:56:23.647 回答