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