2006年 2月 15日 水曜日 cc には、-fast というオプションがあり、これはマクロオプションと呼ばれるものです。-fast を指定するとコンパイラで用意されている最適化オプションが、コンパイルしているマシンに合わせて組み合わされます。マニュアルページでは、あるオプションの指定によって他のいくつかのオプションの組み合わせが実際に使用されることを「オプションが展開される」という言葉で説明しています。
実行コードの最適化としては、-xOn (n=1,2,3,4,5) がありますが、それ以外に最適化のために使えるオプションもあり、-fast オプションは、それらを使用する上での最初のステップとして利用できます。「最初のステップ」という言葉を用いたのは、-fast によって展開されたオプションが適していないプログラムもあるからです。また、コンパイルマシンと実行マシンの構成が同じであるとみなされるため、CPU が異なるマシンでの実行を考慮すべき場合、このオプションの展開結果をそのまま使うことは適当ではありません。が、最適化のために使用するオプションについていくつかの方策を提示してくれることは事実です。
$ cc -c -fast myprog.c
上記のコンパイルでは -fast によって以下のようなオプションに展開されます
-fns
-fsimple=2
-fsingle
-nofstore
-xalias_level=basic
-xbuiltin=%all
-xdepend
-xlibmil
-xlibmopt
-xO5
-xregs=no%frameptr
-xtarget=native
-fns, -fsimple, -fsingle, -nofstore は、浮動小数点演算の結果に影響を与えます。ですので、すべてのプログラムでこれらのオプションを指定できるわけではありません。指定すべきでないプログラムもあります。-xbuiltin は、errno に影響を与えます。-xtarget=native というオプションは、コンパイルしているマシンの構成に合わせて実行ファイルやライブラリを生成するためのオプションです。
実際にどのように展開されるのか確認する手段として -# オプションと -### オプションを使うことができます。-### は、実際のコンパイルを行わず、展開されたオプション等の詳細情報の出力のみを行います。
$ cc -c -### -fast myprog.c
手元のマシンで実行したところ、展開されたオプションは以下のように表示されました。
-c -D__MATHERR_ERRNO_DONTCARE -dalign -fns -nofstore -fsimple=2 -fsingle \ -xalias_level=basic -xarch=sse2 -xbuiltin=%all -xcache=64/64/2:1024/64/16 \ -xchip=opteron -xdepend -xlibmil -xlibmopt -xO5 -xregs=frameptr -xtemp=/tmp
上記のうち、-xarch, -xcache, -xchip の 3 つは、-xtarget=native が展開されたものです。すなわち -fast が、-fns -nofstore .... -xtarget=native に展開され、-xtarget=native が、さらに -xarch, -xcache, -xchip のそれぞれに展開されたことを示しています。-xtarget については、別の機会に取り上げたいと思います。
-fast の展開結果は、コンパイラのバージョンによって異なる場合があります。またコンパイラのバージョンによっては、あるオプションが追加されたり、あるオプションが「廃止予定」と位置づけられたりします。-fast オプションは、使用中のコンパイラが有している最適化のためのオプションについて知るために -### 等と合わせて使用し、そこからアプリケーションに適したものを選んで実際のコンパイルに使う。という手順が一般的なのだと理解しています。
Posted by keiichio
( 2月 15日 2006年, 02:03:13 午後 JST )
Permalink
投稿されたコメント [0]