2017-04-07 2 views
0

私はこのOpenMP tutorialを読んで、そして次のプログラムに遭遇しています: ループインデックスをOpenMPのプライベート変数として設定する必要はありますか?

#include <omp.h> 
#include <stdio.h> 
#include <stdlib.h> 
#define N  100 

int main (int argc, char *argv[]) { 

int nthreads, tid, i; 
float a[N], b[N], c[N]; 

/* Some initializations */ 
for (i=0; i < N; i++) 
    a[i] = b[i] = i; 


#pragma omp parallel shared(a,b,c,nthreads) private(i,tid) 
    { 
    tid = omp_get_thread_num(); 
    if (tid == 0) 
    { 
    nthreads = omp_get_num_threads(); 
    printf("Number of threads = %d\n", nthreads); 
    } 

    printf("Thread %d starting...\n",tid); 

    #pragma omp for 
    for (i=0; i<N; i++) 
    { 
    c[i] = a[i] + b[i]; 
    printf("Thread %d: c[%d]= %f\n",tid,i,c[i]); 
    } 

    } /* end of parallel section */ 

} 

私はループインデックス iprivateが変数かでなければならないかどうか少し混乱しています。同じチュートリアルから導入されたバージョン:

すべてのスレッドが変更と

だから、スレッドがiを制御することはできませんようです(ループインデックスを除く)すべての変数にアクセスすることができ、それが正しいのですか?ところで、private変数からiを削除しようとしましたが、結果はOKと思われます。

答えて

0

いいえループインデックス変数がprivateであることを指定する必要はありません。 OpenMPはこれを強制し、多くのページのどこかで標準と同じように述べています。

さらに、OpenMP標準の要件は、ループ内のループインデックス変数の調整を禁止します。実際OpenMPはFortranに組み込まれている制約の1つであるC(およびC++)プログラムを強制します。これにより、実行時に、ループが最初に遭遇したときにスレッド間で複数の反復を適切にスケジューリングすることができ、実行中にその分布が無効になることを心配する必要がなくなります。

スレッドは、ループ初期化時に、指定されたスケジュール(プログラマーまたは実装定義のデフォルトのいずれか)に従って個々のループ反復を配布するiの値のセットが割り当てられることに注意してください。スレッドがiの 'ローカル'値を更新すると、マッドコード

につながります
関連する問題