プリフェッチ を挿入する目的は、データをキャッシュにロードするタイミングのヒントをプロセッサに知らせてキャッシュ・ミスを減らすことです。プリフェッチによる最適化では、次のオプションを実装しています。
-prefetch[-] |
プリフェッチ挿入を有効または無効 (-prefetch-) にします。このオプションでは、-O3 が指定されている必要があります。-O3 でのデフォルト設定は -prefetch です。 |
コンパイラの最適化を容易にするには、次のことを考慮します。
グローバル変数およびグローバル・ポインタの使用を最小限に抑えます。
複雑な制御フローの使用を最小限に抑えます。
データ型を慎重に選択し、型キャストを行わないようにします。
-prefetch[-] を使用した最適化方法の詳細は、『インテル® Pentium® 4 プロセッサおよび インテル® Xeon™ プロセッサ最適化リファレンス・マニュアル』を参照してください。
-prefetch オプションの他に、組込みサブルーチン MM_PREFETCH およびコンパイラ・ディレクティブ PREFETCH も使用できます。サブルーチン MM_PREFETCH は、1 つのメモリ・キャッシュ・ライン上の指定のアドレスからデータをプリフェッチします。コンパイラ・ディレクティブ PREFETCH は、メモリからのデータ・プリフェッチを有効にします。
次の例は Itanium® ベース・システムでのみ有効です。
do j=1,lastrow-firstrow+1
i = rowstr(j)
iresidue = mod( rowstr(j+1)-i, 8 )
sum = 0.d0
CDEC$ NOPREFETCH a,p,colidx
do k=i,i+iresidue-1
sum = sum + a(k)*p(colidx(k))
enddo
CDEC$ NOPREFETCH colidx
CDEC$ PREFETCH a:1:40
CDEC$ PREFETCH p:1:20
do k=i+iresidue, rowstr(j+1)-8, 8
sum = sum + a(k )*p(colidx(k ))
& + a(k+1)*p(colidx(k+1)) + a(k+2)*p(colidx(k+2))
& + a(k+3)*p(colidx(k+3)) + a(k+4)*p(colidx(k+4))
& + a(k+5)*p(colidx(k+5)) + a(k+6)*p(colidx(k+6))
& + a(k+7)*p(colidx(k+7))
enddo
q(j) = sum
enddo
詳細については、『Intel ® Fortran Language Reference』(英語) マニュアルを参照してください。