2016-07-29 8 views
0

私はFortranプログラムを持っています。擬似コードは次のよう:ループ独立変数のコンパイラ最適化

ここ
do x=1,nx 
    do y=1,ny 
    do z=1,nz 
     function(x,y,z) 
    end do 
    end do 
end do 

function(x,y,z) 
    if(var==1) 
    ! do something 
    else if(var==2) 
    ! do something else 
    end if 
end 

を変数varは、プログラムの先頭で入力ファイルから読み込まれ、実行の過程で変更されません。私はifチェックがfor/doループの深いところにあると読んで、 "キャッシュ効果"を無視してパフォーマンスを分解することができます。変数はもちろん変化しないので、コンパイラはキャッシュ効果の利点が見られるようにコードを並べ替えることができますか?

これが当てはまらない場合、そのようなシナリオを実装するためのチェックまたはより良い方法を避けるにはどうすればよいですか?

+0

私はたぶんこの質問を「広すぎる」と呼んでいます。完全な反対がおそらく有効であると言う2つの答え:ここでは想像力に余りにも余裕がある。たとえば、 'var'は変更されませんが、それは名前付きの定数か、' volatile'属性を持っているとしますか?コンパイラが問題を解決できるかどうかは、コンパイラ(コンパイラフラグに依存するかどうか、実行可能かどうか、コンパイルフラグに依存するかどうか)、およびコードのレイアウト方法によって異なります。また、そのメリットは、アーキテクチャーとブランチの予測に依存する可能性があります。等々。私はあなた自身の完全な例を書いてそれをプロファイルすることをお勧めします。 – francescalus

+0

変数 'var'は定数ではありません。しかし、入力ファイルから読み込みます。そして、 'var'の範囲はプログラムを通して変更されません。 –

答えて

0
do x=1,nx 
    do y=1,ny 
    if (var == 1) 
     do z=1,nz 
     function1(x,y,z) 
     end do 
    else if (var == 2) 
     do z=1,nz 
     function2(x,y,z) 
     end do 
    endif 
    end do 
end do 
+0

私はこれが論理的な解決策であることを知っています。しかし、「機能」自体は非常に長く、他の多くの機能を備えています。 'if'チェックは' function'の小さなコンポーネントです。したがって、2つの関数を記述すると、不必要にコード長が長くなります。その他の提案はありますか? –

+1

@ SathishKrishnan関数が非常に長い場合、 'if'を避けたい点はありません。これは無駄な最適化です。 –

関連する問題