假设我有一个我想在GPU上实现的算法。该算法由一个主循环组成,循环的所有迭代都可以并行运行。此外,循环的每次迭代都有一个内部循环,其迭代可以并行运行。假设我需要主循环的N
次迭代,以及内部循环的M
次迭代(每次主循环迭代),并且我的GPU有L
个核心。
如果N+N*M <= L
,我可以并行运行所有内容。但如果不是这样,我需要决定顺序运行什么。我该如何做出这个决定?例如,如果N=10
,M=5
,L = 20
,我何时应该选择这些选项(或任何其他选项)?:
答案 0 :(得分:1)
你不应该关心一切是否真的可以并行运行。在编写GPU内核以解决您所描述的难以处理的并行问题时,您可能只需要一个二维N x M网格,其中每个元素都是执行第i个内循环的第j次迭代的线程。 / p>
然而......最常见的考虑因素是以不同的方式做事。例如 - 如果M不是太大,你可以展开内循环;或者您可能拥有应该在内部循环的所有M次迭代之后运行的代码,并且同步线程可能不值得花时间(看看您通常如何通过N&gt;&gt;来最大化GPU的并行性)。此外,内存访问模式在决定尝试和并行完成时起着非常重要的作用(例如,参见this presentation)。
所以,没有一个普遍的答案。或许,答案可能是:
(正如another relevant presentation中所述,对此答案的道歉有点含糊不清。)