【发布时间】:2017-07-24 19:17:34
【问题描述】:
在下面的代码中,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之前不会丢失范围。如果它没有失去范围,那么我会假设没有连接,如果没有连接,那么它将继续使用相同的线程。 -
我观察到的是,即使在不同的函数调用中,线程也会被重用——即,在对 fun1 和 fun2 的调用中。
-
据我所知,这与 OMP 设置线程团队有关,我认为这是在项目的整个生命周期内重复使用该团队。这将导致使用相同的线程
-
请参阅this answer 以了解一个相关但更多面向运行时优化的问题。那里说“大多数 OpenMP 实现会在程序启动时创建许多线程,并在程序运行期间保留它们。” (遗憾的是没有任何来源可以确认。)您如何观察到线程被重用?
-
@Shadow 他使用
omp_get_thread_num()确实保证它们会被重复使用
标签: c++ linux parallel-processing openmp gnu-parallel