gpt4 book ai didi

c++ - OpenMP:获取正在运行的线程总数

转载 作者:IT老高 更新时间:2023-10-28 23:20:46 26 4
gpt4 key购买 nike

我需要知道我的应用程序通过 OpenMP 生成的线程总数。不幸的是,omp_get_num_threads() 函数在这里工作,因为它只产生当前团队中的线程数。

但是,我的代码以递归方式运行(基本上是分而治之),只要仍有空闲处理器,我就想生成新线程,但不会再有了。

有没有办法绕过 omp_get_num_threads 的限制并获得 total 正在运行的线程数?

如果需要更多详细信息,请考虑以下非常接近我的工作流程的伪代码:

function divide_and_conquer(Job job, int total_num_threads):
if job.is_leaf(): # Recurrence base case.
job.process()
return

left, right = job.divide()

current_num_threads = omp_get_num_threads()
if current_num_threads < total_num_threads: # (1)
#pragma omp parallel num_threads(2)
#pragma omp section
divide_and_conquer(left, total_num_threads)
#pragma omp section
divide_and_conquer(right, total_num_threads)

else:
divide_and_conquer(left, total_num_threads)
divide_and_conquer(right, total_num_threads)

job = merge(left, right)

如果我用 total_num_threads 值为 4 调用此代码,则用 (1) 注释的条件将 always 评估为 true(因为每个线程组最多包含两个线程),因此代码将始终生成两个新线程,无论有多少线程已经在更高级别运行。

我正在寻找一种平台无关的方法来确定当前在我的应用程序中运行的线程总数。

最佳答案

我认为至少在 OpenMP 3 中没有这样的例程;如果有,我不确定它会有所帮助,因为在线程数的计数和 fork 之间显然存在巨大的竞争条件。如果每个人都看到还有一个线程的空间,然后每个人都生成一个线程,那么您最终可能会超出目标线程数几乎 2 倍。

但是,如果这确实是您的程序的结构,并且您只想限制线程总数,则有一些选择(所有这些都是 OpenMP 3.0):

  1. 使用 OMP_THREAD_LIMIT 环境变量来限制 OpenMP 线程的总数
  2. 使用 OMP_MAX_ACTIVE_LEVELSomp_set_max_active_levels(),或针对 omp_get_level() 进行测试,以限制线程的嵌套深度;如果只需要 16 个线程,则限制为 4 级嵌套
  3. 如果你想要比二的幂更精细的控制,你可以使用omp_get_level()来找到你的关卡,并在各个关卡调用omp_get_ancestor_thread_num(int level)来查找找出哪个线程是您的 parent 、祖 parent 等,然后(使用这个简单的左右 fork )确定一个全局线程 ID。 (我认为在这种情况下,它会像 ∑l=0..L-1 al 2L-l 其中 l 是级别number 从 0 开始,a 是该级别的祖先线程号)。这将让您(例如)允许线程 0-3 fork 但不允许 4-7,这样您最终会得到 12 个线程而不是 16 个线程。我认为这只适用于这种常规情况;如果每个父线程派生出不同数量的子线程,我认为您无法确定唯一的全局线程 ID,因为看起来您只能查询您的直接祖先。

关于c++ - OpenMP:获取正在运行的线程总数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4706494/

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