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

18

今天大多数nVIDIA GPU的共享内存(在OpenCL术语中称为“本地内存”)大小仅为16 KiB。

我有一个应用程序,需要创建一个包含10,000个整数的数组。所以我需要的内存量为10,000 * 4b = 40kb。

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

26

把共享内存看作是显式管理的缓存。您需要将数组存储在全局内存中,并根据需要在共享内存中缓存部分数据,可以通过多次遍历或其他方案来最小化对全局内存的加载和存储。

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

最后一个要点 - 请注意,共享内存在块内的所有线程之间是“共享的” - 每个线程的可用空间远小于16 KB,除非有一个单一的数据结构是块内所有线程共同使用的。


27
通常情况下,只使用全局内存,并在代码正常运行后再考虑使用共享内存进行性能优化,这样更容易。 - Dave O.

9

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


4

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

如果您更喜欢L1而不是Shared,则48KB将被分配给L1,而16KB将被分配给Shared。 如果您更喜欢Shared而不是L1,则48KB将被分配给Shared,而16KB将被分配给L1。

用法:

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

以下是与编程有关的内容,需要翻译成中文。附带了进一步解释的链接:http://developer.download.nvidia.com/compute/cuda/4_1/rel/toolkit/docs/online/group__CUDART__HIGHLEVEL_ge0969184de8a5c2d809aa8d7d2425484.html。 - BugShotGG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接