PREFETCH

目的

XL Fortran では、コンパイラー支援ソフトウェア・プリフェッチ用に、次の 5 つのディレクティブが提供されています。

構文

PREFETCH ディレクティブには、以下の形式があります。



>>-PREFETCH_BY_LOAD--(--prefetch_variable_list--)--------------><
 
 



>>-PREFETCH_FOR_LOAD--(--prefetch_variable_list--)-------------><
 
 



>>-PREFETCH_FOR_STORE--(--prefetch_variable_list--)------------><
 
 
注:
どの PowerPC アーキテクチャーでも有効です。



>>-PREFETCH_BY_STREAM_BACKWARD--(--prefetch_variable--)--------><
 
 
注:
どの PowerPC アーキテクチャーでも有効です。



>>-PREFETCH_BY_STREAM_FORWARD--(--prefetch_variable--)---------><
 
 
注:
どの PowerPC アーキテクチャーでも有効です。

prefetch_variable
プリフェッチされる変数です。 変数は、判別可能なストレージ・アドレスを持つデータ・オブジェクトでなければなりません。 この変数は、組み込みデータ型および派生データ型を含む、任意のデータ型が可能です。 この変数は、プロシージャー名、サブルーチン名、モジュール名、関数名、定数、ラベル、ゼロ・サイズのストリング、または ベクトル添え字を持つ配列にすることはできません。

規則

PREFETCH_BY_STREAM_BACKWARDPREFETCH_BY_STREAM_FORWARDPREFETCH_FOR_LOAD および PREFETCH_FOR_STORE ディレクティブを 使用するには、PowerPC ハードウェア用に コンパイルを行う必要があります。

変数をプリフェッチする時は、変数アドレスが入っているメモリー・ブロックがキャッシュにロードされます。 メモリー・ブロックは、キャッシュ・ラインのサイズと同じです。 キャッシュにロードする変数はメモリー・ブロックのどこにあってもかまわないので、配列のすべてのエレメントを プリフェッチできないこともあります。

これらのディレクティブは、実行可能構文を入れることのできるソース・コードのどこにあってもかまいません。

これらのディレクティブを使用すると、プログラムの実行時オーバーヘッドが増えることがあります。 したがって、ディレクティブを使用するのは必要なときだけにしてください。

プリフェッチ・ディレクティブの効果を最大化するために、単一のプリフェッチの後、または一連のプリフェッチの最後に、 LIGHT_SYNC ディレクティブを指定することをお勧めします。

例 1: この例は、PREFETCH_BY_LOADPREFETCH_FOR_LOAD、 および PREFETCH_FOR_STORE ディレクティブの有効な使用法を示しています。

この例は、キャッシュ・ラインのサイズは 64 バイトであり、プログラムの開始時には宣言済みデータ項目はキャッシュに 存在していないという前提になっています。 ディレクティブを使用することについての理論的解釈は、次のとおりです。

      PROGRAM GOODPREFETCH
 
      REAL*4 A, B, C, TEMP
      REAL*4 ARRA(2**5), ARRB(2**10), ARRC(2**5)
      INTEGER(4) I, K
 
! Bring ARRA into cache for writing.
!IBM* PREFETCH_FOR_STORE (ARRA(1), ARRA(2**4+1))
 
! Bring ARRC into cache for reading.
!IBM* PREFETCH_FOR_LOAD (ARRC(1), ARRC(2**4+1))
 
! Bring all variables into the cache.
!IBM* PREFETCH_BY_LOAD (A, B, C, TEMP, I , K)
 
! A subroutine is called to allow clock cycles to pass so that the
! data is loaded into the cache before the data is referenced.
      CALL FOO()
      K = 32
      DO I = 1, 2 ** 5
 
! Bring ARRB(I*K) into the cache
!IBM* PREFETCH_BY_LOAD (ARRB(I*K))
        A = -I
        B = I + 1
        C = I + 2
        TEMP = SQRT(B*B - 4*A*C)
        ARRA(I) = ARRC(I) + (-B + TEMP) / (2*A)
        ARRB(I*K) = (-B - TEMP) / (2*A)
      END DO
      END PROGRAM GOODPREFETCH

例 2: この例は、キャッシュ・ラインのサイズの合計が 256 バイトであり、初期状態では、宣言済みデータ項目は キャッシュまたはレジスターに存在していないことを想定しています。 また、配列 ARRA および ARRC のすべてのエレメントが、キャッシュに読み込まれます。

     PROGRAM PREFETCH_STREAM
 
     REAL*4 A, B, C, TEMP
     REAL*4 ARRA(2**5), ARRC(2**5), ARRB(2**10)
     INTEGER*4 I, K
 
! All elements of ARRA and ARRC are read into the cache.
!IBM* PREFETCH_BY_STREAM_FORWARD(ARRA(1))
! You can substitute PREFETCH_BY_STREAM_BACKWARD (ARRC(2**5)) to read all
! elements of ARRA and ARRC into the cache.
     K = 32
     DO I = 1, 2**5
        A = -i
        B = i + 1
        C = i + 2
        TEMP = SQRT(B*B -4*A*C)
        ARRA(I) = ARRC(I) + (-B + TEMP) / (2*A)
        ARRB(I*K) = (-B -TEMP) / (2*A)
     END DO
     END PROGRAM PREFETCH_STREAM
 

関連情報

反復カウントの大きなループへのプリフェッチ技法の適用に ついては、STREAM_UNROLL ディレクティブを参照してください。 IBM Copyright 2003