Oracle® Developer Studio 12.5: パフォーマンスライブラリユーザーズガイド

印刷ビューの終了

更新: 2016 年 6 月
 
 

並列度

Oracle Developer Studio パフォーマンスライブラリ内の選択されたルーチンは、OpenMP Fortran Application Program Interface のコンパイラディレクティブ、ライブラリルーチン、および環境変数を使用して並列化されます。これらのルーチンで並列で使用するスレッドの数は、実行時に設定する環境変数 OMP_NUM_THREADS によって制御します。環境変数 PARALLEL を設定することもできますが、両方を設定する場合は、それらが同じ値を持つ必要があり、そうしないと実行時に致命的なエラーが発生します。両方の環境変数は、ユーザーコード内で Oracle Developer Studio パフォーマンスライブラリルーチン USE_THREADS または、OpenMP ルーチン OMP_SET_NUM_THREADS を呼び出すことによってオーバーライドできます。

ユーザーコードは、次を実行して並列化できます。

  • 環境変数 OMP_NUM_THREADS を 1 より大きい値に設定します

  • OpenMP API のディレクティブなどのコンパイラ並列ディレクティブを使用します

    該当するコンパイラフラグ -xopenmp=parallel または -xautopar を使用します

Oracle Developer Studio パフォーマンスライブラリルーチンは、次の条件が満たされている場合に並列で実行します。

  • OMP_NUM_THREADS が 1 より大きい値に設定されています

  • ルーチンが並列領域から呼び出されていません

Oracle Developer Studio パフォーマンスライブラリはその並列化で OpenMP ディレクティブを採用しており、入れ子並列化をサポートしていません。ユーザーコードが上記のように並列化されており、Oracle Developer Studio パフォーマンスライブラリルーチンを呼び出している場合、ルーチンが並列領域から呼び出されていることが検出された場合、ルーチンは順次実行されます。それ以外の場合、ルーチンは並列で実行されます。

POSIX または Oracle Solaris スレッドは、ユーザーコードの並列の選択された領域で実行するように作成することもできます。パフォーマンスライブラリルーチンがこの並列モデルで呼び出されると、ルーチンは並列領域から呼び出されていることを検出できません。そのため、環境変数 OMP_NUM_THREADS が 1 に設定されているか、または設定されていないか、またはユーザーコードの適切な場所で USE_THREADS (3P) の呼び出しが行われる必要があります。そうしないと、未定義の結果で入れ子並列化が行われます。

たとえば、次のコードセグメントを含むプログラムが -xopenmp=parallel とリンクされ、OMP_NUM_THREADS が 4 に設定されている場合、ループが並列で実行され、DGEMM の 4 つのインスタンスが同時に実行されます。ただし、サポートされる並列化のレベルは 1 つだけであるため、各 DGEMM インスタンスは順次実行されます。

!$OMP PARALLEL
    DO I = 1, N
        CALL DGEMM(...)
    END DO
!$OMP END PARALLEL

次のコード例では、プログラムが -xautopar とリンクされていない場合、ループは並列化されませんが、DGEMM の各インスタンスは、4 つのスレッドで実行されます。

    DO I = 1, N
        CALL DGEMM(...)
    END DO

次のコードセグメントを含むプログラムが -xopenmp=parallel とリンクされており、OMP_NUM_THREADS が 1 より大きい値に設定されている場合、示されている領域は、1 つのスレッドで実行されます。ただし、各 DGEMM 呼び出しは、OMP_NUM_THREADS スレッドによって実行されます。

!$OMP SINGLE
    DO I = 1, N
        CALL DGEMM(...)
    END DO
!$OMP END SINGLE

次のコード例では、実行に使用可能な OpenMP スレッド数に関係なく、最大で 2 方向の並列化になります。並列化のレベルは 1 つだけ存在し、それらは 2 つのセクションです。DGEMM 呼び出し内のそれ以上の並列化は抑制されます。

!$OMP PARALLEL SECTIONS
!$OMP SECTION
    DO I = 1, N / 2
        CALL DGEMM(...)
    END DO
!$OMP SECTION
    DO I = N / 2 + 1, N
        CALL DGEMM(...)
    END DO
!$OMP END PARALLEL SECTIONS