2006年 3月 23日 木曜日 前回、-fast オプションについて簡単な紹介をしましたが、そこで -xtarget というオプションについて少し触れました。-fast と同様に、この -xtarget オプションもマクロプションで、以下のオプションに展開されます。
-xarch
-xcache
-xchip
展開される 3 つのオプションは、それぞれ単独で使用することもできますが、本来は -xtarget の展開結果を上書きたい場合に使用するオプションです。特定のアーキテクチャのみで実行されることが明確な場合というのは、それほど多くはないように思われるので、多くの場合でデフォルト値 -xtarget=generic が使用されているのではないかと思います。generic を指定した場合、x86 プラットフォームでは 32bit コードが生成されます。
x86 プラットフォームで 64bit コードを生成する場合には以下のどちらかを指定します。
$ cc -c -xtarget=generic64 -# prog.c
... -xarch=generic64 -xcache=64/64/2:1024/64/16 -xchip=opteron ...
$ cc -c -xtarget=opteron -xarch=amd64 -# prog.c
... -xarch=amd64 -xcache=64/64/2:1024/64/16 -xchip=opteron ...
-xtarget=generic64 は「汎用的な 64bit プラットフォーム」という位置づけであり、展開結果はコンパイラに委ねられています。一方、-xtarget=opteron -xarch=amd64 は、Opteron システム上で AMD64 アーキテクチャの命令を使用することを明示的に指定する方法です。-xtarget=opteron は、-xarch を右側に続けて -xtarget の展開結果を上書きしない場合、以下のように SSE2 命令をサポートした Pentium 4 と Opteron をターゲットとする 32bit コードが生成されます。
-xarch=sse2 -xcache=64/64/2:1024/64/16 -xchip=opteron
-xtarget オプションの右側に、上書きたい内容を指定することです。オプションは左から右に解釈されるため、最後の指定が有効になります。
-xtarget=opteron -xarch=amd64 と指定した場合のそれぞれのオプションの示す内容について引き続き見ていきます。
-xarch=amd64)
-xcache=64/64/2:1024/64/16)
-xchip=opteron)
別の例として、Pentium 3 の手元のマシンで -xtarget=native と実行してみた場合の展開結果を以下に示します。
$ cc -xtarget=native -c -# prog.c
... -xarch=pentium_pro -xcache=16/32/4:512/32/4 -xchip=pentium3 ...
コンパイラの最適化処理では、様々なパラメータを使用して最適化を試みます。パラメータが多ければ多いほど最適化に使える材料が増えることになりますが、特定のアーキテクチャに依存することにもつながるため、汎用性は犠牲になります。コンパイルする際に -xcache を細かく指定するような場合がどの程度ある得るのか。あまり無いような気がします。-xarch を使用して 64bit CPU を指定する、もしくは SSE2 命令セットの有無を指定することは、それなりにあり得ることかもしれません。
参考文献:
Sun Studio 11, cc(1)
Selecting the Best Compiler Options - Sun Developer Network
キャッシュメモリ - Wikipedia
Posted by keiichio
( 3月 23日 2006年, 08:12:00 午後 JST )
Permalink
投稿されたコメント [0]
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]
Sun の C コンパイラ (cc コマンド) は Sun Studio という統合開発環境 (IDE) 製品に含まれていて、無料です。このページに製品紹介があり、ダウンロードページへのリンクもあります。
すでに Sun のコンパイラを使っていらっしゃる方々は多くおられると思うのですが、マニュアルページはどのくらい頻繁に参照されるものなのか、知りたいと思うのですが知る術がありません。私は、仕事上読まねばならぬ、ということもあって頻繁に読むのですが、cc のマニュアルページは、ものすごく長いです。私にとっては more で読むことはとてもキツイです。最初から最後まで一気に読むことができるような長さではありません(と、私は思いますが、どうでしょうか)。
私は Solaris の less (/bin/less) を使っています。そのままでは日本語が表示されないので Google で検索して見つけた EUC-JP 環境で LESSCHARDEF 環境変数を設定する方法を使っています
$ export LESSCHARDEF=32c.
この設定は必要最小限のものなので、文字が化けてしまう箇所も数カ所ありますが、ちょっと参照するだけの場合等、私の典型的な使い方の範囲では、問題なく使えて非常に助かっています。これであとは PAGER 環境変数を less にして読むのですが、やっぱり長いので、手元にある印刷したものも時々読みます。
$ nroff -man /opt/SUNWspro/man/ja/man1/cc.1 | \
/usr/lib/lp/postscript/jpostprint -n 2 | lp
印刷方法は他にも色々あるかと思いますが、今のところ以前に同僚に教えてもらった上記の方法が気に入っています。他の方法をあみ出すほどの詳しい知識を持っていない。という事情もあります。
Posted by keiichio ( 2月 10日 2006年, 03:44:46 午後 JST ) Permalink 投稿されたコメント [0]