大域的な最適化を有効にするには,/optimize:2 かそれ以上の最適化レベルを使用します。/optimize:2 以上を使用すると,局所的な最適化 (/optimize:1) も有効となります。
大域的な最適化には次のものが含まれます。
データ・フロー解析
スプリット・ライフタイム解析
力の縮小 (CPU 集中型の計算を,より少ない CPU サイクルを使用する計算に置き換える)
コードの移動 (コードの押し上げとも呼ばれます)
命令スケジューリング
データ・フローおよびスプリット・ライフタイム解析 (大域データ解析) は,変数と配列全体の値を,計算の際とプログラム単位のさまざまな部分で使用される際に追跡します。この解析において,Visual Fortran は,特定の配列に対する配列引用の任意の組は,両方の場合で定数の添字が使われていない限り,同じメモリー位置を参照するものと仮定します。
ループ内の不変式の不要な再計算を避けるために,Visual Fortran は不変式をループ外に移動して,1 回しか実行されないようにします。
大域データ解析には,どのデータ項目を解析の対象とするかという判断が含まれます。データ項目の中には,1 つのグループとして解析されるものや,個別に解析されるものがあります。Visual Fortran は,次に示す構成要素に参加しているデータ項目については,もっぱらその値を完全に追跡することが不可能であるという理由から,解析を制限したり,解析対象から外すことがあります。
次の宣言に含まれるデータ項目は,大域的な最適化の効果を下げることがあります。
VOLATILE 宣言は,オペレーティング・システムの一部の実行時機能を使用するために必要となります。変数は,Fortran 90/95 言語が提供している以外の規則を使って参照される場合に,VOLATILE として宣言します。次に例を示します。
直接の代入やルーチン呼び出し以外の手段で値が変化することがある COMMON データ項目または共通ブロック全体。このような用途では,変数,または変数が属する COMMON ブロックを VOLATILE として宣言する必要があります。
%LOC ビルトイン関数によって保存されないアドレス。
共通ブロックまたはモジュール中のものを含めて,シグナル処理ハンドラによって読み書きされる変数。
VOLATILE 文により,Visual Fortran は VOLATILE 変数を大域データ解析の対象から外します。
Visual Fortran は,同じ DF コマンドで複数のプログラム単位をコンパイルした場合を除き (「適切なオプションと複数のソース・ファイルのコンパイル」を参照),コンパイルされるプログラム単位の一部でないルーチンが呼び出されたときに,そのルーチン中のデータの流れを追跡することはできません。呼び出したルーチンに渡された引数が呼び出し元のプログラムで再び使用された場合,インタフェース宣言中で適切な INTENT が指定されていない限り,その引数は変更されているものと仮定されます。コンパイラは,呼び出したルーチン中でその引数が引用されているものと仮定しなくてはなりません。
Visual Fortran は,共通ブロック中のデータ項目の最適化を制限します。共通ブロック中のデータ項目が,呼び出したルーチン中で引用されている場合,その値は変更されている可能性があります。次の例では,変数 I は FOO によって変更されている可能性があるので,Visual Fortran はそれ以降の引用での値を予測することができません。
COMMON /X/ I DO J=1,N I = J CALL FOO A(I) = I END DO
Visual Fortran は Fortran 90 モジュール中の変数の最適化を制限します。共通ブロックの場合と同様に,Fortran 90 モジュール中の変数が,呼び出したルーチン中で引用されている場合,その値は変更されている可能性があります。
Visual Fortran は,%LOC 関数によって間接的に引用されている変数や,TARGET 属性を持つ変数については,呼び出したルーチンがこの種の変数へのポインタ引用を解除している可能性があるので,最適化を制限します。
等価グループは,EQUIVALENCE 文によって明示的に,または COMMON 文によって暗黙に作成されます。プログラム・セクションとは,特定の共通ブロック,または特定のルーチン用の局所データ領域です。Visual Fortran は同じプログラム・セクション中の,また同じプログラム単位中の等価グループを結合します。
異なるプログラム・セクション中の等価グループは別々に解析されますが,各グループ中のデータ項目はまとめて解析されるので,最適化の中には個々のグループ中のデータにのみ制限されるものがあります。