【问题标题】:CUDA - what if I choose too many blocks?CUDA - 如果我选择太多块怎么办?
【发布时间】:2011-03-29 16:59:28
【问题描述】:

我仍然对这些未知大小的矩阵感到生气,每个维度可能在 10-20.000 之间变化。

我正在查看 CUDA sdk 并想知道:如果我选择的块数太高怎么办?

类似于 X 和 Y 维度上 9999 x 9999 块的网格,如果我的硬件具有无法容纳所有这些块的 SM,内核会出现问题还是性能会崩溃?

我不知道如何在块/线程中标注可能变化很大的东西。我正在考虑使用我的硬件支持的最大块数,然后让其中的线程在所有矩阵中工作,这是正确的方法吗?

【问题讨论】:

    标签: c++ matrix cuda


    【解决方案1】:

    线程块与内核没有一对一的映射。块在可用时被安排到核心,这意味着您可以根据需要请求任意数量(可能达到限制)。请求大量块只会减慢系统速度,因为它会将无操作线程块加载和卸载到内核。

    您可以在运行时指定网格和块的尺寸。

    编辑:这里是网格和块的尺寸限制,来自文档。

    【讨论】:

      【解决方案2】:

      如果您选择过大的块大小,则会浪费一些周期,而“死”块会被淘汰(通常只有几十微秒的数量级,即使对于“全尺寸”Fermi 或GT200 卡)。这不是一个巨大的惩罚。

      但网格维度应该始终是可计算的先验。通常在可量化的数据并行工作单元之间存在已知关系——例如每个数据点一个线程,或者每个矩阵列一个块或其他任何东西——这允许在运行时计算所需的网格尺寸。

      另一种策略是使用固定数量的块(通常只需要在 GPU 上每个 MP 4-8 个)并让每个块/线程处理多个并行工作单元,因此每个块变成“执着的”。如果在每个线程的设置中存在大量固定开销成本,则可以将这些固定开销分摊到每个线程的更多工作中。

      【讨论】:

      • 对我来说,“持久块”似乎有一个大问题:如果您的工作被平均分配,但工作量在各个拆分之间不相等,这意味着 CUDA 的块调度不再有帮助您将工作分配给可用的 SM。假设其中一个偶数拆分必须比所有其他拆分多做 5 倍的工作。一旦其他人完成,如果您将它们分成大量块,那很好,但是对于持久块的情况,如果您将它们完美地分配给 SM,那么最后一个 SM 的压缩时间将延长 4 倍......请纠正我如果我弄错了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-18
      • 2017-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-25
      相关资源
      最近更新 更多