如何决定如何在GPU中并行化嵌套循环?

时间:2016-04-08 21:39:35

标签: loops parallel-processing cuda gpu

假设我有一个我想在GPU上实现的算法。该算法由一个主循环组成,循环的所有迭代都可以并行运行。此外,循环的每次迭代都有一个内部循环,其迭代可以并行运行。假设我需要主循环的N次迭代,以及内部循环的M次迭代(每次主循环迭代),并且我的GPU有L个核心。

如果N+N*M <= L,我可以并行运行所有内容。但如果不是这样,我需要决定顺序运行什么。我该如何做出这个决定?例如,如果N=10M=5L = 20,我何时应该选择这些选项(或任何其他选项)?:

  1. 并行运行所有主要迭代,并按顺序运行所有内部循环。
  2. 顺序运行所有主要迭代,并行所有内部循环。
  3. 并行运行所有主要迭代,并行运行两个内部循环,其余顺序运行。
  4. 并行运行三个主要迭代,并行运行每个内部循环,依次运行其余的主要迭代和内部循环。

1 个答案:

答案 0 :(得分:1)

你不应该关心一切是否真的可以并行运行。在编写GPU内核以解决您所描述的难以处理的并行问题时,您可能只需要一个二维N x M网格,其中每个元素都是执行第i个内循环的第j次迭代的线程。 / p>

然而......最常见的考虑因素是以不同的方式做事。例如 - 如果M不是太大,你可以展开内循环;或者您可能拥有应该在内部循环的所有M次迭代之后运行的代码,并且同步线程可能不值得花时间(看看您通常如何通过N&gt;&gt;来最大化GPU的并行性)。此外,内存访问模式在决定尝试和并行完成时起着非常重要的作用(例如,参见this presentation)。

所以,没有一个普遍的答案。或许,答案可能是:

  1. 实施您认为可能是个好主意的内容。
  2. 简介。
  3. 看看你是否有效地利用了GPU的资源。
  4. 相应地改变您的实施方法。
  5. 重复。
  6. (正如another relevant presentation中所述,对此答案的道歉有点含糊不清。)