OpenMP线程创建

时间:2017-07-24 19:17:35

标签: c++ linux parallel-processing openmp gnu-parallel

在下面的代码中,OpenMP运行时是重新创建线程还是重用先前创建的线程 - 即使用线程池?

有些同事认为它会重新创建线程,因为“#parallel”子句嵌套在for;我对此表示怀疑并对GDB进行了一些测试,这表明这不是事实。线程实际上被重用了。

#include <cstdio>
#include <omp.h>
#include <unistd.h>

void fun1() {
    for (int j=1; j<=5; j++) {
        #pragma omp parallel for
        for (int i=1; i<=5; i++) {
            printf("Hahaha %d -> %d\n", omp_get_thread_num(), i);
        }
    }
}

void fun2() {
    for (int j=1; j<=5; j++) {
        #pragma omp parallel for
        for (int i=1; i<=5; i++) {
            printf("Hahaha %d -> %d\n", omp_get_thread_num(), i);
        }
    }
}

int main() {

    fun1();

    sleep(1);

    fun2();

    return 0;
}

1 个答案:

答案 0 :(得分:0)

OpenMP标准描述了实现所需的语义,而不是如何实现这些语义,因此标准没有提及线程池的使用。

然而

  1. 该标准确实有关于线程本地存储的持久性的规则,这意味着线程池是实现所需语义的最简单方法。
  2. 编写OpenMP实现的人不是白痴,所以使用尽可能快的实现(因此,使用线程池)。
  3. 因此,虽然您无法保证使用线程池,但您可以合理地预期它是。

    关于此语句的验证,请查看开源OpenMP运行时的代码,例如LLVM(也是英特尔编译器使用的运行时)和GCC的gomp

    P.S。线程池的使用与任何特定OpenMP接口的使用无关,当然,如果强制增加线程数,除了已经存在的线程之外,还必须创建新线程。 p>