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

Posted

技术标签:

【中文标题】GPU 共享内存非常小 - 我该怎么办?【英文标题】:GPU shared memory size is very small - what can I do about it? 【发布时间】:2011-06-26 09:46:44 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

您如何实现这将取决于您的算法 - 如果您可以详细说明您正在尝试实现的具体内容,您可能会得到一些更具体的建议。

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

【讨论】:

+1 通常只使用全局内存会更容易,并且只在代码运行后才考虑使用共享内存进行性能优化。【参考方案2】:

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

【讨论】:

【参考方案3】:

你可以尝试使用cudaFuncSetCacheConfig(nameOfKernel, cudaFuncCachePreferShared, L1)函数。

如果您更喜欢 L1 而不是 Shared,那么 48KB 将分配给 L1,而 16KB 将分配给 Shared。 如果您更喜欢共享而不是 L1,则 48KB 将用于共享,16KB 将用于 L1。

用法:

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

【讨论】:

以及进一步解释的链接:developer.download.nvidia.com/compute/cuda/4_1/rel/toolkit/docs/…

以上是关于GPU 共享内存非常小 - 我该怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

gpu3d和内存是啥关系

GPU 2D 共享内存动态分配

CUDA学习之使用共享内存(shared memory)进行归约求和

nvidia cuda访问gpu共享内存

cuda GPU 编程之共享内存的使用

在 TensorFlow 中使用共享 GPU 内存?