gpt4 book ai didi

multithreading - 生成比线程更多的任务

转载 作者:行者123 更新时间:2023-12-03 12:45:48 24 4
gpt4 key购买 nike

我在几个 OpenMP 教程中读到,您生成的任务不应多于线程数。 For example :“不要启动比可用线程更多的任务,这意味着在封闭的并行区域中可用。”

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

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

生成的任务不要多于线程数,这通常是一个好建议吗?还是这是胡说八道?

最佳答案

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

引用的文章对我来说似乎相当挑剔,虽然他的批评有一定道理,但我不同意这种消极态度。我不打算详述他针对 OpenMP 任务提出的每一个观点。是的,有很多方法可以用 OpenMP 任务搬起石头砸自己的脚,就像一般的任何并行范例或 C/C++/Fortran 一样。

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

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

关于multithreading - 生成比线程更多的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52234246/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com