我正在使用 OpenMP 在 C 中撰寫一些代碼來并行化一些塊。我遇到了一些我無法解釋的奇怪行為。我已經重寫了我的代碼,以便最小程度地復制問題。
首先,這是我撰寫的要在并行區域中運行的函式。
void foo()
{
#pragma omp for
for (int i = 0; i < 3; i )
{
#pragma omp critical
printf("Hello %d from thread %d.\n", i, omp_get_thread_num());
}
}
然后這是我的整個程式。
int main()
{
omp_set_num_threads(4);
#pragma omp parallel
{
for (int i = 0; i < 2; i )
{
foo();
#pragma omp critical
printf("%d\n", i);
}
}
return 0;
}
當我編譯并運行這段代碼(使用 g -std=c 17)時,我在終端上得到以下輸出:
Hello 0 from thread 0.
Hello 1 from thread 1.
Hello 2 from thread 2.
0
0
Hello 2 from thread 2.
Hello 1 from thread 1.
0
Hello 0 from thread 0.
0
1
1
1
1
i是一個私有變數。我希望該函式foo每個執行緒運行兩次。所以我希望在終端中看到八個“Hello from %d thread %d.\n”陳述句,就像我在列印時看到的八個數字一樣i。那么這里給出了什么?為什么在同一個回圈中,OMP 的行為如此不同?
uj5u.com熱心網友回復:
這是因為它#pragma omp for是一個作業共享結構,所以它將在執行緒之間分配作業,在這方面使用的執行緒數無關緊要,只是回圈計數的數量(2*3=6)。
如果您使用omp_set_num_threads(1);,您還會看到 6 個輸出點。如果您使用的執行緒數多于回圈計數,則內部回圈中的某些執行緒將處于空閑狀態,但您仍會看到正好 6 個輸出。
另一方面,如果洗掉#pragma omp for行,您將看到(number of threads)*2*3(=24) 輸出。
uj5u.com熱心網友回復:
從以下檔案omp parallel:
團隊中的每個執行緒都執行并行區域內的所有陳述句,作業共享結構除外。
強調我的。由于omp forinfoo是一個作業共享結構,因此每次外部迭代只執行一次,無論有多少執行緒運行 in 中的并行塊main。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/481906.html
