1
在下面的代码中,OpenMP运行时将重新创建线程,还是重新使用先前创建的线程 - 即使用线程池?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;
}
我会认为它会重用相同的线程,因为它没有失去范围,直到它退出最外层的'for'。如果它没有丢失范围,那么我会认为没有连接,如果没有连接,那么它会继续使用相同的线程。 – Matthew
我正在观察的是,即使跨越不同的函数调用 - 即通过调用fun1和fun2,线程也被重用。 – JohnTortugo
从我可以告诉它与OMP设置线程团队有关,我会假设在整个项目生命周期中重新使用该团队。这将导致使用相同的线程 – Matthew