我需要知道我的应用程序通过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)如果我使用total_num_threads值为4调用这段代码,带有(1)的条件注释将始终计算为true (因为每个线程团队最多包含两个线程),因此无论有多少线程在更高的级别上运行,代码总是会生成两个新线程。
我正在寻找一种确定当前在我的应用程序中运行的线程总数的platform-independent 方法.
发布于 2011-01-16 17:19:46
考虑到您知道正在创建的线程的确切数量,我想出的最简单的解决方案是保留您自己的线程计数器。
请注意,我对OpenMP完全一无所知,因为我从未真正使用过它。
发布于 2011-01-17 15:49:46
您展示的代码有一个问题,即"omp节“必须在"omp节”的词法范围内。我假设您的意思是"omp并行“是"omp并行部分”。另一种方法是使用"omp任务“,这样就不必计算线程数。您只需将线程分配到并行区域,并允许OpenMP实现将任务分配给线程。
https://stackoverflow.com/questions/4706494
复制相似问题