【问题标题】:CUDA - Better Occupancy vs Less Global Memory Access?CUDA - 更好的占用与更少的全局内存访问?
【发布时间】:2010-12-20 02:14:59
【问题描述】:

我的 CUDA 代码必须使用(减少到均值/标准,计算直方图)4 个数组,每个数组有 2048 个浮点数,并且已经从以前的内核存储在设备内存中。

通常建议启动至少与我的多处理器一样多的块。然而,在这种情况下,我可以将这些数组中的每一个加载到单个块的共享内存中,因此只启动 4 个块。

这远非“让 gpu 保持忙碌”,但如果我使用更多块,我将需要通过全局内存进行更多块间通信,并且我预计由于额外的额外时间,多处理器的任何额外利用都会受到影响将数据传入和传出全局内存。

在这种情况下并行化的最佳方法是什么?

【问题讨论】:

    标签: arrays parallel-processing cuda


    【解决方案1】:

    不建议在 CUDA 中进行块间通信。此外,Fermi 将支持并发内核执行,因此未来更高的占用率将变得不那么重要。所以我建议现在只保留较低的入住率,除非性能低到无法接受。

    【讨论】:

    • 来自未来的你好!有什么改变吗?入住率似乎仍然很重要。
    • 未来未来你好!在那些日子里,入住率风靡一时。
    【解决方案2】:

    This example 展示了如何使用 Thrust 在单个归约中计算所有“汇总统计信息”。另一个示例展示了如何使用thrust::sort 计算直方图。

    【讨论】:

      【解决方案3】:

      您所做的工作量相对较小,因此您可能应该坚持使用四个块。将数据保留在 GPU 本地以供先前/后续内核使用仍然是一个优势。

      Fermi 将允许并发内核,正是这种情况下受益最大,因为您可以在该内核执行时启动下一个内核来占用剩余的 SM。但是,这确实假设两个内核之间没有依赖关系 - 自然,您将无法在前一个内核完成之前启动一个依赖于前一个内核结果的新内核。

      【讨论】:

        【解决方案4】:

        我认为您不需要一次所有 2048 个浮点数,如果您必须减少,您可以将数组拆分为不同的部分,然后在块执行结束时合并结果。你能展示一些示例代码吗?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-01-10
          • 2012-05-06
          • 2015-01-28
          • 2015-08-22
          • 2014-07-21
          • 2011-06-28
          • 2016-09-21
          相关资源
          最近更新 更多