私は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
ループの深いところにあると読んで、 "キャッシュ効果"を無視してパフォーマンスを分解することができます。変数はもちろん変化しないので、コンパイラはキャッシュ効果の利点が見られるようにコードを並べ替えることができますか?
これが当てはまらない場合、そのようなシナリオを実装するためのチェックまたはより良い方法を避けるにはどうすればよいですか?
私はたぶんこの質問を「広すぎる」と呼んでいます。完全な反対がおそらく有効であると言う2つの答え:ここでは想像力に余りにも余裕がある。たとえば、 'var'は変更されませんが、それは名前付きの定数か、' volatile'属性を持っているとしますか?コンパイラが問題を解決できるかどうかは、コンパイラ(コンパイラフラグに依存するかどうか、実行可能かどうか、コンパイルフラグに依存するかどうか)、およびコードのレイアウト方法によって異なります。また、そのメリットは、アーキテクチャーとブランチの予測に依存する可能性があります。等々。私はあなた自身の完全な例を書いてそれをプロファイルすることをお勧めします。 – francescalus
変数 'var'は定数ではありません。しかし、入力ファイルから読み込みます。そして、 'var'の範囲はプログラムを通して変更されません。 –