假设我有一个需要随机访问 1024 个元素数组的 32 个线程块。我想通过最初将块从全局转移到共享来减少全局内存调用的数量。我有两个想法:
A:
my_kernel()
{
CopyFromGlobalToShared(1024 / 32 elements);
UseSharedMemory();
}
Run Code Online (Sandbox Code Playgroud)
或乙:
my_kernel()
{
if (first thread in block)
{
CopyFromGlobalToShared(all elements);
}
UseSharedMemory();
}
Run Code Online (Sandbox Code Playgroud)
哪个更好?或者还有其他更好的方法吗?
一个更好。
与 CPU 相比,GPU 具有更高的内存带宽。但是,只有在 GPU 中运行的线程遵循特定模式时才能实现峰值带宽。
这种模式需要合并内存访问。这意味着您需要使用多个线程来访问全局内存中的顺序地址,并特别注意对齐方式。
您可以在 CUDA 文档中找到有关 Coalesced Access to Global Memory 的更多详细信息。
http://docs.nvidia.com/cuda/cuda-c-best-practices-guide/index.html#coalesced-access-global-memory