2008年 12月 24日 水曜日
やっぱり Sun がスキ!
Sun Studio の最適化機能を使ってみよう!
はじめに
先日 Sun Studio Express November 2008 が リリース されました。Sun Studio は Sun が Solaris と Linux 向けに提供している開発環境で、C, C++, Fortran 等のコンパイラが含まれています。Sun Studio Express November 2008 は February, July に続く今年三つ目のリリースで、OpenMP 3.0 に対応しています。こちらの ダウンロードサイト からダウンロードしてお使い頂けます。
本記事では Sun Studio Express November 2008 のダウンロード、インストールから、簡単な使用方法、XSLTMark を使用したベンチマークまでをご紹介したいと思います。
ダウンロードとインストール
Sun Studio Express November 2008(以下 Sun Studio Express)の対応プラットフォームと動作環境は こちら になります。もし対応した環境が無い場合は VirtualBox 等を使用してご用意下さい。今回の記事では x86-64 システム上の Solaris 10 10/08 環境を想定しております。
次にこちらの サイト から Sun Studio Express をダウンロードします。中段の入力エリアにメールアドレスを入力頂いて [Download Now] ボタンを押して下さい。続いて、開いたページの [Download Tarfile Installer] をクリックします。新しいページが開きますので、Platform で Solaris x86 を選択し、License Agreement をお読み頂いてから License Agreement のチェックボックスをクリックし、[Continue >>] ボタンを押して下さい。続くページで [StudioExpress-sol-x86-2008-11-ii.sh] をクリックするとダウンロードが始まります。ファイルのサイズは約 178MB です。
ダウンロードした StudioExpress-sol-x86-2008-11-ii.sh を実行します。StudioExpress-sol-x86-2008-11-ii.sh は Sun Studio Express を tar と bzip2 でアーカイブし、シェルスクリプトでラップした物です。実行するとカレントディレクトリに Sun Studio Express が展開されます。今回は /var/tmp/ss というディレクトリを作成して、そこに展開しました。
% mkdir /var/tmp/ss % mv StudioExpress-sol-x86-2008-11-ii.sh /var/tmp/ss % cd /var/tmp/ss % sh StudioExpress-sol-x86-2008-11-ii.sh --accept-sla
- --accept-sla は使用ライセンスに同意するというオプションです。
SUNWspro ディレクトリの中にコンパイラが入っていますので、アーカイブが展開されたらコマンド実行パスを設定して下さい。
% ls -F
SUNWspro/ netbeans-6.5ss/
StudioExpress-sol-x86-2008-11-ii.sh
% PATH=/var/tmp/ss/SUNWspro/bin:${PATH}
% export PATH
以上で、ダウンロードとインストールは完了です。
基本的な使い方
まずは簡単な C のプログラムをコンパイルしてみます。以下の 2 行を prog01.c という名前で保存して下さい。
#include <stdio.h>
int main() { puts("Sun Studio Express!!"); }
- C 言語のコンパイルは cc コマンドを使用します。-o オプションで生成されるバイナリの名前を指定します。この辺りは他のコンパイラと大きな違いは無いと思います。
% cc prog01.c -o prog01 % ls prog01 prog01.c % ./prog01 Sun Studio Express!!
% cc -V cc: Sun Ceres C 5.10 SunOS_i386 2008/10/22 usage: cc [ options] files. Use 'cc -flags' for details
% cc -flags -# Verbose mode -### Show compiler commands built by driver, no compilation -APreprocessor predicate assertion ...snip...
% cc -S prog01.c % ls prog01 prog01.c prog01.s
% cc -# prog01.c -o prog01 ### Note: NLSPATH = /var/tmp/ss/SUNWspro/prod/bin/../lib/locale/%L/LC_MESSAGES/%N.cat:/var/tmp/ss/SUNWspro/prod/bin/../../lib/locale/%L/LC_MESSAGES/%N.cat ### command line files and options (expanded): ### prog01.c -o prog01 /var/tmp/ss/SUNWspro/prod/bin/acomp -xldscope=global -i prog01.c -y-fbe -y/var/tmp/ss/SUNWspro/prod/bin/fbe -y-xarch=generic -y-o -yprog01.o -y-verbose -y-xthreadvar=no%dynamic -y-comdat -xdbggen=no%stabs+dwarf2+usedonly -xdbggen=incl -y-s -m32 -fparam_ir -Qy -D__SunOS_5_10 -D__SUNPRO_C=0x5100 -D__SVR4 -D__sun -D__SunOS -D__unix -D__i386 -D__BUILTIN_VA_ARG_INCR -D__C99FEATURES__ -Xa -D__PRAGMA_REDEFINE_EXTNAME -Dunix -Dsun -Di386 -D__RESTRICT -xc99=%all,no%lib -D__FLT_EVAL_METHOD__=-1 -I/var/tmp/ss/SUNWspro/prod/include/cc "-g/var/tmp/ss/SUNWspro/prod/bin/cc -c " -fsimple=0 -D__SUN_PREFETCH -destination_ir=yabe /var/tmp/ss/SUNWspro/prod/bin/fbe -s -o prog01.o -warn=%none -Qy /tmp/yabeAAAuWaqKY rm /tmp/yabeAAAuWaqKY ### Note: LD_LIBRARY_PATH =### Note: LD_RUN_PATH = /usr/ccs/bin/ld /var/tmp/ss/SUNWspro/prod/lib/crti.o /var/tmp/ss/SUNWspro/prod/lib/crt1.o /var/tmp/ss/SUNWspro/prod/lib/values-xa.o -o prog01 prog01.o -Y "P,/var/tmp/ss/SUNWspro/prod/lib:/usr/ccs/lib:/lib:/usr/lib" -Qy -lc /var/tmp/ss/SUNWspro/prod/lib/crtn.o
- 途中で -D__sun という表記が見られますが、-D は #define と同じ意味です。Solaris 固有のコードを #ifdef で分岐させる場合に __sun が使用されます。また、-m32 は 32bit でコンパイルする為のフラグです。Solaris では 64bit OS 上でもデフォルトで 32bit コンパイルされます。
% cc -m64 prog01.c -o prog01.64 % file prog01.64 prog01.64: ELF 64-bit LSB executable AMD64 Version 1 [SSE FXSR FPU], dynamically linked, not stripped
% cc -flags | grep native -native Optimize for the host system (-xtarget=native) % cc prog01.c -o prog01.gen % file prog01.gen prog01.gen: ELF 32-bit LSB executable 80386 Version 1 [FPU], dynamically linked, not stripped % cc -native prog01.c -o prog01.ntv % file prog01.ntv prog01.ntv: ELF 32-bit LSB executable 80386 Version 1 [SSE FXSR FPU], dynamically linked, not stripped
- -native を付けた方では SSE が有効になっている事が分かります。
% cc -flags | grep fast -fast Optimize using a selection of options % cc -fast prog01.c -o prog01
% cc -# -fast prog01.c -o prog01.fast ### Note: NLSPATH = /var/tmp/ss/SUNWspro/prod/bin/../lib/locale/%L/LC_MESSAGES/%N.cat:/var/tmp/ss/SUNWspro/prod/bin/../../lib/locale/%L/LC_MESSAGES/%N.cat ### command line files and options (expanded): ### -D__MATHERR_ERRNO_DONTCARE -fns -nofstore -fsimple=2 -fsingle -xalias_level=basic -xarch=ssse3 -xbuiltin=%all -xcache=32/64/8:4096/64/16 -xchip=core2 -xdepend -xlibmil -xlibmopt -xO5 -xregs=frameptr prog01.c -o prog01.fast /var/tmp/ss/SUNWspro/prod/bin/acomp -xldscope=global -depend -i prog01.c -arrayloc -o /tmp/acompAAA.25902.EMaWLY -r /tmp/acompBAA.25902.FMaWLY -xdbggen=no%stabs+dwarf2+usedonly -D__MATHERR_ERRNO_DONTCARE -single -fns -xalias_level=basic -xdbggen=incl -m32 -fparam_ir -O5 -Qy -D__SunOS_5_10 -D__SUNPRO_C=0x5100 -D__SVR4 -D__sun -D__SunOS -D__unix -D__i386 -D__BUILTIN_VA_ARG_INCR -D__C99FEATURES__ -Xa -D__PRAGMA_REDEFINE_EXTNAME -Dunix -Dsun -Di386 -D__RESTRICT -xbuiltin=%all -xc99=%all,no%lib -D__FLT_EVAL_METHOD__=0 -I/var/tmp/ss/SUNWspro/prod/include/cc "-g/var/tmp/ss/SUNWspro/prod/bin/cc -fast -c " -fsimple=2 -D__SUN_PREFETCH -destination_ir=iropt /var/tmp/ss/SUNWspro/prod/bin/iropt -F -o /tmp/iroptDAA.25902.HMaWLY -N/tmp/iroptCAA.25902.GMaWLY -is /tmp/acompAAA.25902.EMaWLY /tmp/acompBAA.25902.FMaWLY -xarch=ssse3 -m32 "-xcache=32/64/8:4096/64/16" -xchip=core2 -fns -xlibmopt -fsimple=2 -xprefetch=auto,explicit -xprefetch_level=1 -xvector=no -depend -xbuiltin=%all -xalias_level=basic -O5 -Qy /var/tmp/ss/SUNWspro/prod/bin/ir2hf -verbose -m32 /tmp/iroptDAA.25902.HMaWLY /tmp/acompAAA.25902.EMaWLY /tmp/iroptEAA.25902.IMaWLY /var/tmp/ss/SUNWspro/prod/bin/fbe -O5 -xbuiltin -Qy /var/tmp/ss/SUNWspro/prod/bin/ube -iropt -verbose -O5 -ZB -xalias_level=basic -s -xbuiltin -fsimple=2 -fsr=1 -xprefetch=auto,explicit -xprefetch_level=1 -fbe /var/tmp/ss/SUNWspro/prod/bin/fbe -il /var/tmp/ss/SUNWspro/prod/lib/libm.il -m32 -xarch=ssse3 "-xcache=32/64/8:4096/64/16" -xchip=core2 -xvector=no -xthreadvar=no%dynamic -Qy -comdat -ipo prog01.o -S /tmp/ube_sGAA.25902.JMaWLY /tmp/iroptEAA.25902.IMaWLY /var/tmp/ss/SUNWspro/prod/bin/fbe -xchip=core2 -o prog01.o -s -Qy /tmp/ube_sGAA.25902.JMaWLY ### Note: LD_LIBRARY_PATH =### Note: LD_RUN_PATH = /usr/ccs/bin/ld /var/tmp/ss/SUNWspro/prod/lib/crti.o /var/tmp/ss/SUNWspro/prod/lib/crt1x.o /var/tmp/ss/SUNWspro/prod/lib/values-xa.o -o prog01.fast prog01.o -Y "P,/var/tmp/ss/SUNWspro/prod/lib/sse2:/var/tmp/ss/SUNWspro/prod/lib:/usr/ccs/lib:/lib:/usr/lib" -Qy -lmopt -lc /var/tmp/ss/SUNWspro/prod/lib/crtn.o
- 何もオプションを付けなかった場合と比べると大幅に出力が増えているのが分かります。-O5 オプションは最適化レベルを最大の 5 に設定するオプションです。-fast オプションには -native オプション相当の最適化も含まれていますので、コンパイルしたプラットフォームに最適なバイナリが生成されます。
XSLTMark
XSLTMark は XSLT のベンチマークです。現在は libxslt の配布物に含まれており、XML データの生成ツールと多数の XSLT ファイルが用意されています。 この XSLTMark を使用して Sun Studio のオプションの効果を見てみましょう。
XSLTMark のダウンロードとインストール
まずは libxml と libxslt をダウンロードします。libxml は libxslt をコンパイルする為に必要です。
% mkdir /var/tmp/xsltmark % cd /var/tmp/xsltmark % wget ftp://xmlsoft.org/libxml2/libxml2-2.7.2.tar.gz % wget ftp://xmlsoft.org/libxslt/libxslt-1.1.24.tar.gz
コンパイルに入る前に PATH 環境変数に /usr/sfw/bin を付け加えて下さい。
% PATH=/usr/sfw/bin:${PATH}
% export PATH
次に libxml をビルドします。Sun Studio の C コンパイラを使用する場合は configure スクリプトを実行する際に CC=cc を付けます。CFLAGS='' は後で最適化の効果を比較する為に付けています。
% mkdir ss-32-normal
% cd ss-32-normal
% gtar zxf ../libxml2-2.7.2.tar.gz
% cd libxml2-2.7.2
% CC=cc CFLAGS='' ./configure --prefix=${PWD}/build
% gmake
% gmake install
% cd ..
続いて libxslt をビルドします。libxml の時と同様、CC=cc CFLAGS='' オプションを付けます。
% gtar zxf ../libxslt-1.1.24.tar.gz
% cd libxslt-1.1.24
% CC=cc CFLAGS='' ./configure --prefix=${PWD}/build --with-libxml-prefix=${PWD}/../libxml2-2.7.2/build
% gmake
% gmake tests
% gmake install
% LD_LIBRARY_PATH_32=${PWD}/../libxml2-2.7.2/build/lib:${PWD}/build/lib:${LD_LIBRARY_PATH_32}; export LD_LIBRARY_PATH_32
standard.gz のインストール
ベンチマークを行う際に XMLTMark が生成するデータを使う事も可能ですが、試験をする度にデータの中身が変わると正確な比較になりません。今回は既に用意されている外部のデータを使用する事にします。
% mkdir /var/tmp/xmldata % cd /var/tmp/xmldata % wget http://www.ins.cwi.nl/projects/xmark/Assets/standard.gz % gunzip standard.gz % mv standard standard.xml
ベンチマーク!!
では早速性能を測定してみましょう。性能の測定には XSLTMark に含まれる prettyprint.xsl を使用します。XSLT を処理するコマンドは xsltproc、XML データに適用する XSLT ファイルは prettyprint.xsl、XSLT ファイルを適用する XML データは standard.xml、時間の測定には ptime コマンドを使用します。
% ptime ./libxslt-1.1.24/build/bin/xsltproc --noout ./libxslt-1.1.24/tests/XSLTMark/prettyprint.xsl /var/tmp/xmldata/standard.xml
測定結果
三回測定した結果は、一回目が 128.746 秒、二回目が 128.773 秒、三回目が 128.756 で、平均 128.758 秒でした。
最適化を施す
次にコンパイル時に最適化を加えて、なおかつ 64bit でコンパイルしてみます。コンパイル手順は以下の通りです。最適化オプションには -fast を使用しました。64bit のバイナリを生成する為に -m64 オプションを付けています。
% mkdir ss-64-opt
% cd ss-64-opt
% gtar zxf ../libxml2-2.7.2.tar.gz
% cd libxml2-2.7.2
% CC=cc CFLAGS='-m64 -fast' ./configure --prefix=${PWD}/build
% gmake
% gmake install
% cd ..
% gtar zxf ../libxslt-1.1.24.tar.gz
% cd libxslt-1.1.24
% CC=cc CFLAGS='-m64 -fast' ./configure --prefix=${PWD}/build --with-libxml-prefix=${PWD}/../libxml2-2.7.2/build
% gmake
% gmake tests
% gmake install
% LD_LIBRARY_PATH_64=${PWD}/../libxml2-2.7.2/build/lib:${PWD}/build/lib:${LD_LIBRARY_PATH_64}; export LD_LIBRARY_PATH_64
ベンチマーク - その2
最適化を施した場合も三回測定してみました。使用するコマンドやデータは同じです。
% ptime ./libxslt-1.1.24/build/bin/xsltproc --noout ./libxslt-1.1.24/tests/XSLTMark/prettyprint.xsl /var/tmp/xmldata/standard.xml
測定結果 - その2
測定結果は、一回目が 84.992 秒、二回目が 84.969 秒、三回目が 85.007 で、平均 84.989 秒でした。最適化前が 128 秒でしたので、コンパイルオプションを変更しただけで処理時間が約 2/3 に縮まった事になります。
最後に
最後までお読み下さいましてどうもありがとうございます。以上、Sun Studio Express の使い方の初歩をご紹介させて頂きました。Sun Studio Express をダウンロードし、インストールし、自作のプログラムや既存のプログラムをコンパイルする基本的な手順がご理解頂けたと思います。更なる最適化や自動並列化等の高度な機能の使い方、コンパイルが通らない場合の対処方法はいずれ改めてご紹介させて頂きたいと思います。
Posted at 12:57午後 12 24, 2008 by Daisuke Homma in Sun | 投稿されたコメント[0]