1

Fortran での並列プログラミングでの共通ブロックの使用についていくつか質問があります。

  1. サブルーチンには共通ブロックがあります。並列 do 領域ですべての共通ブロックと threadprivate を宣言する必要がありますか?

  2. 彼らはどのように情報を渡しますか? 各スレッドに個別の共通クロックが必要で、並列領域の最後まで情報を渡すようにします。ここで起こりますか?

  3. 私のFordサブルーチンは共通ブロックのいくつかの変数を変更し、Condactサブルーチンはそれらを再度上書きしますが、関数はCondactサブルーチンからの値を使用します。2 番目のサブルーチンと関数は、各スレッドの前のサブルーチンから変数をコピーしますか?

    program
    ...
    ! Loop which I want to parallelize
    !$OMP parallel DO
    !do I need to declear all common block and threadprivate them here?
    I = 1, N
    ...
    call FORD(i,j)
    ...
    !$OMP END parallel DO
    end program
    
    subroutine FORD(i,j)
    dimension zl(3),zg(3)
    common /ellip/ b1,c1,f1,g1,h1,d1,
    .               b2,c2,f2,g2,h2,p2,q2,r2,d2
    common /root/ root1,root2
    !$OMP threadprivate (/ellip/,/root/)
    !this subroutine rewrite values of b1, c1 and f1 variable.
    CALL CONDACT(genflg,lapflg)
    return
    end subroutine
    
    SUBROUTINE CONDACT(genflg,lapflg)
    common /ellip/ b1,c1,f1,g1,h1,d1,b2,c2,f2,g2,h2,p2,q2,r2,d2
    !$OMP threadprivate (/ellip/)
    ! this subroutine rewrite b1, c1 and f1 again
    call function f(x)
    RETURN
    END
    
    function f(x)
    common /ellip/ b1,c1,f1,g1,h1,d1,
    .               b2,c2,f2,g2,h2,p2,q2,r2,d2
    !$OMP threadprivate (/ellip/)
    ! here the function uses the value of b1, c1, f1 from CONDAT subroutine.
    end
    
4

2 に答える 2

1

まず、上記のコメントで、common特に最新のコードで を使用しないことを強くお勧めします。グローバル データと並列処理を混在させることは、苦痛の世界を求めているだけです。実際、グローバル データは完全に悪い考えです。

わかりました、あなたの質問:

  1. サブルーチンには共通ブロックがあります。並列 do 領域ですべての共通ブロックと threadprivate を宣言する必要がありますか?

いいえ、threadprivate宣言ディレクティブであり、コードの宣言部分でのみ使用する必要があり、すべての宣言の後に表示する必要があります。

  1. 彼らはどのように情報を渡しますか? 各スレッドに個別の共通クロックが必要で、並列領域の最後まで情報を渡すようにします。ここで起こりますか?

ご想像のとおり、各スレッドは独自のバージョンのcommonブロックを取得します。最初の並列領域に入るとcopyin、マスター スレッドから値をブロードキャストしない限り、ブロック内の値は未定義になります。後続の並列領域では、各領域で使用されるスレッドの数が同じである限り、値が保持されます。領域間では、共通ブロックの値はマスター スレッドの値になります。

  1. これらの共通ブロックは、サブルーチンからアクセスできますか? 私の Ford サブルーチンは共通ブロックのいくつかの変数を書き換え、Condat サブルーチンはそれらを再度書き換えますが、関数は Condat サブルーチンの値を使用します。ここでthreadprivateを使用して共通ブロック変数を書き換えて渡すことは可能ですか?

私はあなたがここで何を求めているのかわからないことを認めなければなりません. しかし、OpenMP コードの異なるサブプログラム間で変数を通信するために common を使用できるかどうかを尋ねる場合、シリアル Fortran と同様に答えはイエスです (大文字化に注意してください)。

于 2015-09-08T09:56:37.463 に答える