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

印刷ビューの終了

更新: 2016 年 6 月
 
 

Fortran の例

単一プロセッサアプリケーションのパフォーマンスを向上させるには、Oracle Developer Studio パフォーマンスライブラリルーチンの呼び出しに置き換えることができるアプリケーション内のコード構文を特定します。マルチプロセッサアプリケーションのパフォーマンスは、並列化の機会を特定することによって向上させることができます。

アプリケーションのパフォーマンスを向上させるために、Oracle Developer Studio パフォーマンスライブラリのルーチンを使用するようにコードを変更する場合は、Oracle Developer Studio パフォーマンスライブラリのルーチンとまったく同じ機能を持つコードブロックを特定します。次のコード例は行列とベクトルの積 y ← Ax + y で、これは DGEMV サブルーチンで置き換えることができます。

      DO I = 1, N
          DO J = 1, N
              Y(I) = Y(I) + A(I,J) * X(J)
          END DO
      END DO

ほかにも、コードブロックが Oracle Developer Studio パフォーマンスライブラリの複数の呼び出しに相当する場合や、コードの一部を Oracle Developer Studio パフォーマンスライブラリのルーチンで置き換えられる場合があります。次のコード例について考えてみましょう。

      DO I = 1, N
          IF (V2(I,K) .LT. 0.0) THEN
              V2(I,K) = 0.0
          ELSE
              DO J = 1, M
                  X(J,I) = X(J,I) + Vl(J,K) * V2(I,K)
              END DO
          END IF 
      END DO

このコード例は、Oracle Developer Studio パフォーマンスライブラリのルーチン DGER を使用して次のように書き直すことができます。

      DO I = 1, N
          IF (V2(I,K) .LT. 0.0) THEN
             V2(I,K) = 0.0
          END IF 
      END DO
      CALL DGER (M, N, 1.0D0, X, LDX, Vl(l,K), 1, V2(1,K), 1)

同じコード例を、Fortran 95 固有の文を使用して次のように書き直すこともできます。

WHERE (V(1:N,K) .LT. 0.0) THEN
       V(1:N,K) = 0.0
END WHERE 
CALL DGER (M, N, 1.0D0, X, LDX, Vl(l,K), 1, V2(1,K), 1)

V2 内の負の数値を 0 に置き換えるコードは、それと同等のものが Oracle Developer Studio パフォーマンスライブラリにはないため、外側のループの外へ出されます。そのコードを独自のループに移動すると、ループの残りは一般行列 x のランク 1 更新であり、これは BLAS の DGER ルーチンで置き換えることができます。

パフォーマンスの向上量は、Oracle Developer Studio パフォーマンスライブラリのルーチンが使用するデータによっても異なります。たとえば、V2 に負または 0 の値が多数含まれていると、時間の大部分がランク 1 更新以外に費やされることがあります。この場合、コードを DGER の呼び出しに置き換えても、パフォーマンスは向上しない可能性があります。

使用する Oracle Developer Studio パフォーマンスライブラリルーチンは、ほかのループインデックスの評価によっても異なります。たとえば、K への参照がループインデックスである場合、上記のコード例のループはより大きいコード構造の一部になっている可能性があり、DGEMV または DGER のループを何らかの形式の行列乗算に変換できることがあります。その場合、DGER 呼び出しのループを使用するよりも、行列乗算ルーチンを 1 回呼び出す方がパフォーマンスを向上させることができます。

Oracle Developer Studio パフォーマンスライブラリのルーチンはすべて MT セーフ (マルチスレッドに対して安全) なので、Oracle Developer Studio パフォーマンスライブラリのルーチンの呼び出しが含まれているループを自動並列化コンパイラで並列化すると、マルチプロセッサプラットフォームでパフォーマンスを向上させることができます。

次のコード例は、Oracle Developer Studio パフォーマンスライブラリのルーチンに自動並列化コンパイラの並列化ディレクティブを組み合わせた例を示しています。

      C$PAR DOALL
      DO I = 1, N
             CALL DGBMV ('No transpose', N, N, ALPHA, A, LDA,
     $     B(l,I), 1, BETA, C(l,I), 1)
      END DO

Oracle Developer Studio パフォーマンスライブラリには、帯行列にベクトルを乗算する DGBMV という名前のルーチンがあります。このルーチンを適切な構造のループに配置することによって、Oracle Developer Studio パフォーマンスライブラリのルーチンを使用して帯行列に行列を乗算できます。ループ内にサブルーチン呼び出しがあると並列化が禁止されるため、コンパイラはこのループをデフォルトでは並列化しません。ただし、Oracle Developer Studio パフォーマンスライブラリのルーチンは MT セーフなので、並列化ディレクティブを使用して、このループを並列化するようにコンパイラに指示できます。

コンパイラディレクティブは、通常は並列化可能でないサブルーチン呼び出しが含まれているループを並列化する場合にも使用できます。たとえば、一部の連立 1 次方程式ソルバーは、ベンダーによっては MT セーフでないコードでルーチンが実装されている場合があるため、そのようなソルバーの呼び出しが含まれているループは、通常は並列化できません。連立 1 次方程式ソルバーのエキスパートドライバ (名前が SVX または SVXX で終わるルーチン) の呼び出しが含まれているループは、通常はほかの実装の LAPACK では並列化できません。Oracle Developer Studio パフォーマンスライブラリの LAPACK の実装では、そのような呼び出しを含むループの並列化が可能なので、マルチプロセッサプラットフォームのユーザーは、このようなループの並列化によってパフォーマンスを向上させることができます。