生成的任务多于线程数



我在几个 OpenMP 教程中读到,您不应该生成比线程更多的任务。例如:"启动的任务不要超过可用线程数,这意味着在封闭并行区域中可用。

假设我们要遍历二叉树,节点的子树可以并行遍历,并且我们的机器有四个核心。按照上面的建议,我们在根目录下生成两个任务,一个用于左侧子树,一个用于右侧子树。在这两个任务中,我们生成两个嵌套任务,每个子树同样一个。现在,我们有四个任务,所以我们不再进一步拆分它们。

但是,如果四个子树的大小不同,则某些核心将不得不等待。负载均衡继续进一步拆分并生成 16 个任务不是更好吗?即使我们只有四个核心?

生成更多的任务而不是有线程通常是一个好建议还是胡说八道?

您可以使用比线程更多的任务,这是任务的主要目的。是的,使用比线程更多的任务将有助于负载平衡。

引用的文章对我来说似乎相当批评,虽然他的批评有一些优点,但我不同意消极的观点。我不打算深入讨论他针对OpenMP任务提出的每一个观点。是的,有一些方法可以用 OpenMP 任务搬起石头砸自己的脚,就像任何并行范式或一般的 C/C++/Fortran 一样。

在使用任务实现树算法时,我会担心的一件事是任务创建开销。虽然任务比线程更轻量级,但它们不是免费的。如果你在树中只有几条指令,你的叶节点,并且你为它们中的每个人创建了一个任务,你将有一个巨大的开销。

您可以为此使用omp task if (depth < theshold),但这仍然会在更深的层中留下一点开销。为了完全避免这种情况,您必须实现两个版本的遍历函数,一个总是调用串行函数的串行函数和一个有条件地调用任务或串行函数的任务版本。这也可以提供更好的优化。应选择阈值,使最小task duration >> task overhead和任务计数足以避免负载不平衡(取决于变化(。

最新更新