在当今大多数 nVIDIA GPU 上,共享内存(OpenCL 术语中的“本地内存”)的大小仅为 16 KiB。
我有一个应用程序,我需要在其中创建一个包含 10,000 个整数的数组。所以我需要容纳 10,000 个整数 = 10,000 * 4b = 40kb 的内存量。
- 我该如何解决这个问题?
- 是否有任何 GPU 具有超过 16 KiB 的共享内存?
在当今大多数 nVIDIA GPU 上,共享内存(OpenCL 术语中的“本地内存”)的大小仅为 16 KiB。
我有一个应用程序,我需要在其中创建一个包含 10,000 个整数的数组。所以我需要容纳 10,000 个整数 = 10,000 * 4b = 40kb 的内存量。
将共享内存视为显式管理的缓存。您需要将数组存储在全局内存中,并根据需要将其部分缓存在共享内存中,方法是进行多次传递或其他一些方案,以最大限度地减少加载和存储到/来自全局内存的数量。
你如何实现这将取决于你的算法——如果你能给出一些你正在尝试实现的细节,你可能会得到一些更具体的建议。
最后一点 - 请注意共享内存在块中的所有线程之间共享- 每个线程的内存少于 16 kb,除非您有一个块中所有线程共有的单一数据结构。
所有计算能力 2.0 及更高版本的设备(大多数在过去一两年内)每个多处理器都有 48KB 的可用共享内存。话虽如此,Paul 的回答是正确的,因为您可能不想将所有 10K 整数加载到单个多处理器中。
您可以尝试使用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);