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