GPU共享内存的大小非常小 - 我该怎么办呢?

时间:2011-02-13 11:04:53

标签: gpu nvidia gpu-shared-memory

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

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

3 个答案:

答案 0 :(得分:26)

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

如何实现这一点将取决于您的算法 - 如果您可以提供一些您正在尝试实施的具体细节,您可能会得到一些更具体的建议。

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

答案 1 :(得分:9)

所有计算能力2.0及更高版本的设备(大多数在过去一两年内)每个多处理器拥有48KB的可用共享内存。那个开始说,Paul的回答是正确的,因为你可能不希望将所有10K整数加载到一个多处理器中。

答案 2 :(得分:4)

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

如果您更喜欢L1 to Shared,那么48KB将转到L1,16KB将转到Shared。 如果您更喜欢共享到L1,则48KB将转到共享,16KB将转到L1。

用法:

cudaFuncSetCacheConfig(matrix_multiplication, cudaFuncCachePreferShared);
matrix_multiplication<<<bla, bla>>>(bla, bla, bla);