Kon*_*lph 12 c++ parallel-processing openmp
我需要知道我的应用程序通过OpenMP生成的线程总数.不幸的是,该omp_get_num_threads()
功能也不会在这里,因为它只产生的线程在目前球队数量的工作.
但是,我的代码以递归方式运行(基本上是分而治之),只要仍有空闲的处理器,我想生成新的线程,但不会更多.
有没有办法绕过限制omp_get_num_threads
并获得正在运行的线程总数?
如果需要更多细节,请考虑以下伪代码,它们非常接近地模拟我的工作流程:
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)
Run Code Online (Sandbox Code Playgroud)
如果我使用total_num_threads
值4来调用此代码,则条件注释(1)
将始终求值true
(因为每个线程团队最多包含两个线程),因此代码将始终生成两个新线程,无论已经运行了多少线程在更高的层次上.
我正在寻找一种独立于平台的方法来确定我的应用程序中当前运行的线程总数.
我认为至少在 OpenMP 3 中没有这样的例程;如果有的话,我不确定它会有帮助,因为在线程数计数和分叉之间显然存在巨大的竞争条件。如果每个人都看到还有剩余一个线程的空间,然后每个人都生成一个线程,那么您最终可能会超出目标线程数几乎 2 倍。
但是,如果这确实是您的程序的结构,并且您只想限制线程总数,则可以选择(所有这些都是 OpenMP 3.0):
OMP_THREAD_LIMIT
变量限制OpenMP线程总数OMP_MAX_ACTIVE_LEVELS
、 或omp_set_max_active_levels()
、或测试omp_get_level()
、 来限制线程的嵌套深度;如果您只需要 16 个线程,则限制为 4 层嵌套omp_get_level()
来查找您的级别,并omp_get_ancestor_thread_num(int level)
在各个级别调用以找出哪个线程是您的父母、祖父母等,并从中(使用这个简单的左右分叉)确定全局线程 ID。(我认为在这种情况下,它会像 Σ l=0..L-1 a l 2 L-l一样,其中 l 是从 0 开始的级别编号,a 是该级别的祖先线程编号)。这会让您(比如说)允许线程 0-3 分叉,但不允许 4-7 分叉,这样您最终会得到 12 个而不是 16 个线程。我认为这只适用于这种常规情况;如果每个父线程分叉不同数量的子线程,我认为您无法确定唯一的全局线程 ID,因为看起来您只能查询您的直接祖先。