将全局复制到共享内存的最佳方法

Boy*_*nov 3 c c++ cuda

假设我有一个需要随机访问 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)

哪个更好?或者还有其他更好的方法吗?

kan*_*yin 5

一个更好。

与 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