CUDA中最大(每个块的共享内存)/(每个块的线程数),100%MP负载

CUDA中最大(每个块的共享内存)/(每个块的线程数),100%MP负载,cuda,gpgpu,gpu-shared-memory,Cuda,Gpgpu,Gpu Shared Memory,我正在尝试用CUDA 2.0(NVIDIA 590)处理大型结构阵列。我想使用共享内存。我已经使用CUDA占用率计算器进行了实验,试图为每个线程分配最大的共享内存,这样每个线程都可以处理整个数组元素。 然而,在100%多处理器负载的计算器中,我能看到的(每个块共享内存)/(每个块线程)的最大值是32字节,这对于单个元素(数量级)是不够的。 32字节是(每个块共享内存)/(每个块线程)的最大可能值吗? 是否可以说哪个alter4native更可取—在全局内存中分配部分数组,还是只使用未加载的多处理

我正在尝试用CUDA 2.0(NVIDIA 590)处理大型结构阵列。我想使用共享内存。我已经使用CUDA占用率计算器进行了实验,试图为每个线程分配最大的共享内存,这样每个线程都可以处理整个数组元素。 然而,在100%多处理器负载的计算器中,我能看到的(每个块共享内存)/(每个块线程)的最大值是32字节,这对于单个元素(数量级)是不够的。 32字节是(每个块共享内存)/(每个块线程)的最大可能值吗? 是否可以说哪个alter4native更可取—在全局内存中分配部分数组,还是只使用未加载的多处理器?还是只能通过实验来决定? 我可以看到的另一种选择是多次处理数组,但这似乎是最后的选择。
这是我第一次尝试使用CUDA做一些非常复杂的事情,所以我可能会错过一些其他选项…

在设计CUDA内核时,需要记住许多硬件限制。以下是您需要考虑的一些约束:

  • 单个块中可以运行的最大线程数
  • 一次可在流式多处理器上加载的最大块数
  • 每个流式多处理器的最大寄存器数
  • 每个流式多处理器的最大共享内存量
您首先遇到的这些限制中的任何一个都会成为限制占用率的约束(您所指的最大占用率是“100%多处理器负载”?)。一旦你达到一定的入住率阈值,关注入住率就变得不那么重要了。例如,33%的占用率并不意味着您只能实现GPU最大理论性能的33%。瓦西里·沃尔科夫(Vasily Volkov)在2010年GPU技术会议上做了一次精彩的演讲,建议不要太担心占用率,而是尝试通过在内核中使用一些显式缓存技巧(和其他东西)来最小化内存事务。你可以在这里观看演讲:


确保您使用的内核设计能够提供最佳性能的唯一真正方法是测试所有可能性。您需要对运行它的每种类型的设备重新进行性能测试,因为它们在某些方面都有不同的约束。这显然是乏味的,特别是当不同的设计模式导致根本不同的内核时。在某种程度上,我通过使用模板引擎在运行时根据设备硬件规范动态生成内核来解决这个问题,但这仍然有点麻烦。

在设计CUDA内核时,需要记住许多硬件限制。以下是您需要考虑的一些约束:

  • 单个块中可以运行的最大线程数
  • 一次可在流式多处理器上加载的最大块数
  • 每个流式多处理器的最大寄存器数
  • 每个流式多处理器的最大共享内存量
您首先遇到的这些限制中的任何一个都会成为限制占用率的约束(您所指的最大占用率是“100%多处理器负载”?)。一旦你达到一定的入住率阈值,关注入住率就变得不那么重要了。例如,33%的占用率并不意味着您只能实现GPU最大理论性能的33%。瓦西里·沃尔科夫(Vasily Volkov)在2010年GPU技术会议上做了一次精彩的演讲,建议不要太担心占用率,而是尝试通过在内核中使用一些显式缓存技巧(和其他东西)来最小化内存事务。你可以在这里观看演讲:


确保您使用的内核设计能够提供最佳性能的唯一真正方法是测试所有可能性。您需要对运行它的每种类型的设备重新进行性能测试,因为它们在某些方面都有不同的约束。这显然是乏味的,特别是当不同的设计模式导致根本不同的内核时。在某种程度上,我通过使用模板引擎根据设备硬件规格在运行时动态生成内核来解决这个问题,但这仍然有点麻烦。

谢谢,那堂课基本上回答了我的问题,那堂课基本上回答了我的问题