2017-03-02 10 views
1

これは、openmp cで行列を転置するプログラムです。コンパイラiはgccを使用しています。 私はprivate(i、j)とprivate(i)の両方を別々に試しました。それはスレッド化されているので、私は変更が正確に起こっているのを見つけることができませんでした。このコードでprivate(i、j)の効果は何ですか?プライベート(i、j)からiまたはjを省略すると、何らかの変更がありますか?

#pragma omp parallel for private (i,j) 
    for(i=1; i<size; i++) 
{ 
#pragma omp parallel for 
    for(j=0; j<i; j++) 
     { 
     temp = mat1[i][j]; 
      mat1[i][j] = mat1[j][i]; 
      mat1[j][i] = temp; 
     } 
} 

実行時は毎回異なります。私はデュアルコアを持っていても5スレッドでこれを試しました。ありがとうございました。

+0

も参照してください。http://stackoverflow.com/q/37845291/620382 – Zulan

+2

私は、「temp」のプライベート/共有属性を心配しています。 –

+0

OMP_NESTEDを設定しましたか?そうでない場合は、内部の並列処理が省略されます(これはおそらくあなたが望むものです:-))。 (25スレッドを開始)。あなたは可能な限り小さな範囲で変数を宣言するスタイルを採用する方がずっと優れています。それではここでプライベートについて心配する必要はありません。 –

答えて

1

このコードでプライベート(i、j)の効果は何ですか?

なし。

private(i、j)からiまたはjを省略すると、変更はありますか? OpenMPのは、forループforparallel fortaskloop、又はdistribute構築物の(S)関連

ループ反復変数(S)であることを指定するため

いいえ、(あります)プライベート。

明示的に反復変数privateを宣言する必要はありません。そのため、何も変更されません。一般的には、のデータ共有プロパティのデータ共有属性を宣言してはいけませんが、OpenMPはこれを含む重複した属性宣言の特​​別な例外を作成します。

関連する問題