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

时间:2012-04-16 13:54:15

标签: cuda gpgpu gpu-shared-memory

我正在尝试使用CUDA 2.0(NVIDIA 590)处理大型结构阵列。我想为它使用共享内存。我已经尝试了CUDA占用计算器,尝试为每个线程分配最大共享内存,以便每个线程可以处理整个数组元素。 但是,我在100%多处理器加载的计算器中可以看到的最大值(每块的共享内存)/(每块的线程数)是32字节,这对于单个元素(在数量级上)是不够的。 32个字节是(每个块的共享内存)/(每个块的线程数)的最大可能值吗? 是否可以说哪个alter4native更可取 - 在全局内存中分配数组的一部分还是只使用欠载的多处理器?或者它只能通过实验来决定? 我能看到的另一个替代方案是在几个过程中处理数组,但它看起来像是最后的手段。 这是我第一次尝试与CUDA非常复杂的东西,所以我可能会错过其他一些选择......

1 个答案:

答案 0 :(得分:6)

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

  • 您可以在一个块中运行的最大线程数
  • 您可以同时在流式多处理器上加载的最大块数
  • 每个流式多处理器的最大寄存器数
  • 每个流式多处理器的最大共享内存量

您首先遇到的这些限制中的哪一个会成为限制您占用的约束(您所指的最大占用率是“100%多处理器负载”?)。一旦达到一定的入住率,注意入住就变得不那么重要了。例如,占用率为33%并不意味着您只能达到GPU最大理论性能的33%。 Vasily Volkov在2010年GPU技术大会上发表了精彩演讲,建议不要过多担心占用情况,而是尝试通过在内核中使用一些显式缓存技巧(和其他内容)来最小化内存事务。你可以在这里观看演讲:http://www.gputechconf.com/gtcnew/on-demand-GTC.php?sessionTopic=25&searchByKeyword=occupancy&submit=&select=+&sessionEvent=&sessionYear=&sessionFormat=#193

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