今天大多数nVIDIA GPU的共享内存(在OpenCL术语中称为“本地内存”)大小仅为16 KiB。
我有一个应用程序,需要创建一个包含10,000个整数的数组。所以我需要的内存量为10,000 * 4b = 40kb。
- 如何解决这个问题?
- 是否有任何GPU具有超过16 KiB的共享内存?
今天大多数nVIDIA GPU的共享内存(在OpenCL术语中称为“本地内存”)大小仅为16 KiB。
我有一个应用程序,需要创建一个包含10,000个整数的数组。所以我需要的内存量为10,000 * 4b = 40kb。
把共享内存看作是显式管理的缓存。您需要将数组存储在全局内存中,并根据需要在共享内存中缓存部分数据,可以通过多次遍历或其他方案来最小化对全局内存的加载和存储。
如何实现这一点取决于您的算法 - 如果您能提供一些正在尝试实现的具体细节,您可能会得到更具体的建议。
最后一个要点 - 请注意,共享内存在块内的所有线程之间是“共享的” - 每个线程的可用空间远小于16 KB,除非有一个单一的数据结构是块内所有线程共同使用的。
所有计算能力大于2.0的设备(大多数是在过去一两年内发布的)每个多处理器都有48KB可用的共享内存。话虽如此,保罗的答案是正确的,因为您可能不想将所有10K个整数加载到单个多处理器中。
您可以尝试使用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);