CUDA - 如果我选择太多块怎么办?

时间:2011-03-29 16:59:29

标签: c++ matrix cuda

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

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

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

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

2 个答案:

答案 0 :(得分:13)

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

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

编辑:以下是文档中网格和块的尺寸限制。

enter image description here

答案 1 :(得分:2)

如果你选择一个过大的块大小,你会浪费一些周期,而“死”块会退役(通常只有几十微秒的数量级,即使是“全尺寸”费米的最大网格尺寸或GT200卡)。这不是一个巨大的惩罚。

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

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