c-OpenMP线程id如何使用递归



这里有一个简单的递归程序,它为每个递归调用拆分为两个。正如预期的那样,结果是对rec进行2+4+8次调用,但线程数量始终相同:两个,id在0和1之间来回跳动。我希望每个递归调用都能保留id,最后会生成8个线程。到底发生了什么?代码有问题吗?

#include <stdio.h>
#include <omp.h>
void rec(int n) {
if (n == 0)
return;
#pragma omp parallel num_threads(2)
{
printf("Currently at %d -- total %dn", omp_get_thread_num(), omp_get_num_threads());
rec(n - 1);
}
}
int main() {
omp_set_nested(1);
rec(3);
}

您的代码按照OpenMP标准的预期工作。在OpenMP文档中,您可以找到以下关于omp_get_num_threads:的信息

摘要:omp_get_num_threads例程返回线程数在当前团队中

绑定:omp_get_num_threads区域的绑定区域是最里面的封闭平行区域

效果:omp_get_num_threads例程返回线程数在执行例行程序所在的平行区域的团队中区域结合。如果从程序的顺序部分调用,则例程返回1。

omp_get_thread_num具有相同的绑定区域:

omp_get_thread_num区域的绑定区域是最内层封闭平行区域

这意味着omp_get_num_threadsomp_get_thread_num只绑定到最内部的平行区域,因此使用多少嵌套的平行区域并不重要。您的每个并行区域都由#pragma omp parallel num_threads(2)定义,因此omp_get_num_threads的返回值为2(只要您有足够的线程可用(,而omp_get_thread_num的返回值是01

最新更新