當我輸入 i = 1 它輸出:
c[0] = 7
c[0] = 7
c[0] = 7
c[0] = 7
c[0] = 7
但是當我輸入 i = 0 它輸出:
c[1] = 9
c[2] = 11
c[3] = 13
c[4] = 15
c[0] = 7
i = 0 的輸出不應該是 i = 1 的輸出,反之亦然?
#include<omp.h>
#include<stdio.h>
int main(){
int a[5] = {1, 2, 3, 4, 5} ;
int b[5] = {6, 7, 8, 9, 10} ;
int c[5];
int tid;
int i;
scanf("%d", &i);
#pragma omp parallel if(i)
{
#pragma omp parallel num_threads(5)
{
tid = omp_get_thread_num();
c[tid] = a[tid] b[tid];
printf("c[%d] = %d\n", tid, c[tid]);
}
}
}```
uj5u.com熱心網友回復:
您看到的行為是正確的(假設變數tid已被宣告private,否則您在此處有競爭條件)。
實際上,當且僅當is not時,第一個#pragama omp parallel if(i)將創建一個具有實作定義的執行緒數的并行區域。但是,如果已創建并行區域,則將忽略以下內容,因為默認情況下,嵌套并行是禁用的。i0#pragma omp parallel num_threads(5)
如果i是0并且沒有創建第一個并行區域(這里不再有嵌套并行性),那么確實會創建第二個并生成 5 個執行緒。
總之,i非 null 阻止創建內部并行區域,而inull 允許它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/485105.html
