魔術師見習いのノート

プロフィール

魔術師見習い
Author魔術師見習い-_-.
Twitter魔術師見習い

コンピュータ関係のメモを主に書きます.

MENU

SESCのコンパイル

投稿日:
タグ:

Debian6-0.2.1でSESCをコンパイルする際にうまくいかなかったのでその時の苦労をメモ.コードを書き換えたりしているが,とりあえず実行できるものはできた.

作業環境

コンパイルに用いた環境はこんな感じである.

archx86_64
OSDebian6-0.2.1
pwd/home/user/00_workspace/sesc
GCCのバージョン情報※後述のものを参照
user% gcc -v
Using built-in specs.
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 4.4.5-8'
--with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs
--enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr
--program-suffix=-4.4 --enable-shared --enable-multiarch
--enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib
--without-included-gettext --enable-threads=posix
--with-gxx-include-dir=/usr/include/c++/4.4 --libdir=/usr/lib
--enable-nls --enable-clocale=gnu --enable-libstdcxx-debug
--enable-objc-gc --with-arch-32=i586 --with-tune=generic
--enable-checking=release --build=x86_64-linux-gnu
--host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.4.5 (Debian 4.4.5-8) 

SESCの取得

SESCはの取得は, Hashim's Space を参考に行った.以下のコマンドを実行するとカレントディレクトリにsescディレクトリが生成される.

user% cvs -z3 -d:pserver:anonymous@sesc.cvs.sourceforge.net:/cvsroot/sesc co -P sesc 
コマンドの詳細については省略する.

コンパイル

流れとしては,"configure"によってシミュレータの種類を設定,"make"によってソースコードをコンパイルし,"make sesc.conf"でシミュレータの標準(オプションで指定しなかった場合のパラメータ)の設定ファイルを用意する."make sesc.conf"はconfsディレクトリからただコピーしてくるだけだが,シミュレータの種類に応じて適切なものをコピーしてくれる.

はじめにconfigureスクリプトを走らせる.今回は特にオプションを指定しない.

user% ./configure
configure: creating ./config.status
config.status: creating Makefile
config.status: creating Make.defs

次にMAKEコマンドを実行する.

user% make
g++  -O3 -momit-leaf-frame-pointer -march=i686 -funroll-loops
-fsched-interblock  -ffast-math -fno-strict-aliasing -freg-struct-return
-I/home/user/00_workspace/sesc/obj/Linux_obj
-I/home/user/00_workspace/sesc/./src/libapp
-I/home/user/00_workspace/sesc/./src/libsuc
-I/home/user/00_workspace/sesc/./src/libcore
-I/home/user/00_workspace/sesc/./src/libnet
-I/home/user/00_workspace/sesc/./src/libmem
-I/home/user/00_workspace/sesc/./src/libvmem
-I/home/user/00_workspace/sesc/./src/libll
-I/home/user/00_workspace/sesc/./src/libmint
-I/home/user/00_workspace/sesc/./src/libpint
-I/home/user/00_workspace/sesc/./src/libsmp -I.
-I/home/user/00_workspace/sesc/./src/librst -W -Wall
-Wno-unused -DPACKAGE_NAME=\"esesc\" -DPACKAGE_TARNAME=\"esesc\"
-DPACKAGE_VERSION=\"2\" -DPACKAGE_STRING=\"esesc\ 2\"
-DPACKAGE_BUGREPORT=\"renau@soe.ucsc.edu\ luisceze@cs.uiuc.edu\"
-DLINUX -DLENDIAN  -DSIMICS -DPOSIX_MEMALIGN -DNDEBUG -DDEBUG2=0 -o
/home/user/00_workspace/sesc/obj/Linux_obj/mkdep
/home/user/00_workspace/sesc/./src/misc/mkdep.cpp
/home/user/00_workspace/./src/misc/mkdep.cpp:1: error: CPU you selected
does not support x86-64 instruction set

開始して速攻で躓いた.

エラーの原因は選択したISAらしい.MAKEコマンドのログ情報を見てみると,コンパイラのクロスコンパイルなどをするための-marchオプションがi686になっているのが原因っぽい.GCCの設定ファイルってmake.confだったかなぁ(違うかも…)と思い探してみるが,見つからない.面倒臭いので他の方法が探してみた.

user% egrep i686 **/*
src/Makefile.defs.CYGWIN:COPTS  += -march=i686
src/Makefile.defs.Linux:# Default architecture is i686
src/Makefile.defs.Linux:OptArch := -march=i686
src/libsuc/Snippets.h:#if defined(__tune_i686__)
EGREPコマンドを使うと(GREPでも良いが),割と簡単にそれっぽいのを発見した.ファイルを見てみたところMakefile.defs.Linuxを書き換えれば良さそうである.ちなみに**/*はZSHが使用可能なパターンマッチングの方法である.VIコマンドで-march=より右をnoconaかcore2に変更する.
user% vi src/Makefile.defs.Linux 
Before:
     66 # Default architecture is i686
     67 OptArch := -march=i686
     68 # But now try to detect the real architecture
After:
     66 # Default architecture is i686
     67 #OptArch := -march=i686
     68 OptArch := -march=nocona
     69 # But now try to detect the real architecture
そして再びmakeコマンドを実行する.

──が,またしてもエラー.

/home/user/00_workspace/sesc/./src/libcore/FetchEngine.cpp:79:
error: ‘USHRT_MAX’ was not declared in this scope
FetchEngine.cppがlimits.hで定義されているUSHRT_MAXが読み込めてないらしい.面倒臭いので,読み込めてない原因は調べずコードを書き加えた.
Before:
     25 #include "SescConf.h"
     26 #include "FetchEngine.h"
     27 #include "OSSim.h"
     28 #include "LDSTBuffer.h"
     29 #include "GMemorySystem.h"
     30 #include "GMemoryOS.h"
     31 #include "GProcessor.h"
     32 #include "MemRequest.h"
     33 #include "Pipeline.h"
     34 
     35 
After:
     25 #include "SescConf.h"
     26 #include "FetchEngine.h"
     27 #include "OSSim.h"
     28 #include "LDSTBuffer.h"
     29 #include "GMemorySystem.h"
     30 #include "GMemoryOS.h"
     31 #include "GProcessor.h"
     32 #include "MemRequest.h"
     33 #include "Pipeline.h"
     34 
     35 #include <limits.h>
追加行は本来ならC++なので,#include <climits>とすべきかもしれないが,元々Cの書き方と混ざったソースコードだったので,気にせず<limits.h>とする.

FetchEngine.cppを解決すると,またしてもlimits.hが原因のエラー.

/home/user/00_workspace/sesc/./src/libcore/Cluster.cpp:161:
error: ‘INT_MAX’ was not declared in this scope
今度はCluster.cppでlimits.hで定義されたマクロがないと言われたので同じように追記する.
Before:
     23 #include "Cluster.h"
     24 
     25 #include "GEnergy.h"
     26 #include "GMemorySystem.h"
     27 #include "GProcessor.h"
     28 #include "Port.h"
     29 #include "Resource.h"
     30 #include "SescConf.h"
     31 
     32 #include "estl.h"
     33 
     34 // Begin: Fields used during constructions
After:
     23 #include "Cluster.h"
     24 
     25 #include "GEnergy.h"
     26 #include "GMemorySystem.h"
     27 #include "GProcessor.h"
     28 #include "Port.h"
     29 #include "Resource.h"
     30 #include "SescConf.h"
     31 
     32 #include "estl.h"
     33 
     34 #include <limits.h>
     35 
     36 // Begin: Fields used during constructions
ファイルの修正を終え,再度makeを叩く.

しかし前進はしているもののまたしてもエラー(結果からいえば次が最後の修正だった).

/home/user/00_workspace/sesc/./src/libsuc/Config.cpp:211:
error: ‘LONG_MAX’ was not declared in this scope
/home/user/00_workspace/sesc/./src/libsuc/Config.cpp: In
member function ‘bool Config::isPower2(const char*, const char*,
int32_t)’:
/home/user/00_workspace/sesc/./src/libsuc/Config.cpp:762:
error: ‘uint32_t’ was not declared in this scope
/home/user/00_workspace/sesc/./src/libsuc/Config.cpp:762:
error: expected ‘;’ before ‘v’
/home/user/00_workspace/sesc/./src/libsuc/Config.cpp:764:
error: ‘v’ was not declared in this scope
/home/user/00_workspace/sesc/./src/libsuc/Config.cpp:771:
error: ‘v’ was not declared in this scope
make[1]: ***
[/home/user/00_workspace/sesc/obj/Linux_obj/Config.o] エラー 1
今度はいろいろとエラーが出ているが,そのうち一つはまたしてもlimits.hが原因だった(結果としてはなんとかなったが,やはり読み込まない原因を最初に確認すべきだったかもしれない).LONG_MAXはlimits.hで定義されたマクロであるため,同様の文をConfig.cppに追加する.また,以降のエラーは恐らくuint32_tが原因で連鎖的に起きてそうな気がするので,そこだけ修正する.EGREPコマンドで確認したところ,uint32_tはplist/plist.hで定義されているのは分かったが,これだけ読み込んでも意味がなかった.ネットで調べたところstdint.hを読み込めば良いらしいので,これを読み込むように修正する.この型を使うこと自体C++では推奨されていないようだったが,typedef unsigned int uint32_t;のようなプロセッサに依存する書き方よりはマシかと思い,素直にstdint.hを取り込む方法をとる.
Before:
     28 #include 
     29 #include 
     30 
     31 #include "alloca.h"
     32 #include "Config.h"
     33 #include "ReportGen.h"
     34 
     35 Config::Record::~Record(void){
After:
     28 #include 
     29 #include 
     30 
     31 #include "alloca.h"
     32 #include "Config.h"
     33 #include "ReportGen.h"
     34 
     35 #include <limits.h>
     36 #include <stdint.h>
     37 
     38 Config::Record::~Record(void){
修正後,再びコンパイルし,ようやくmakeが無事終了した.

設定ファイルのコピー

以上まででプログラムは完成しているが,実際に実行するためには設定ファイルが必要である.設定ファイルは自分で書くか,コピーするか,MAKEコマンドによって自動で最適なものをコピーする方法がある.もちろん初めてなのでMAKEコマンドを使う.

make sesc.conf
Generating sesc.conf from:
/home/user/00_workspace/sesc/./confs/mem.conf
cp /home/user/00_workspace/sesc/./confs/mem.conf sesc.conf
cp /home/user/00_workspace/sesc/./confs/shared.conf .

実行確認

実行確認もまたMAKEコマンドで行える.オプションを指定することで,プログラムの呼び出しや引数指定を行ってくれるのだ.

user% make testsim
make[1]: `sesc.mem' は更新済みです
./sesc.mem -h0x800000 -csesc.conf
/home/user/00_workspace/sesc/./tests/crafty <
/home/user/00_workspace/sesc/./tests/tt.in
static[0x1008db40-0x101b3dd4] heap[0x101b4000-0x109b4000]
stack[0x109b4000-0x111ac000] -> [0x2b06b4000000-0x2b06b511e4c0]

Crafty v14.3

sesc_simulation_mark 0 (simulated) @30177037
White(1): sesc_simulation_mark 1 (simulated) @30226502
White(1): pondering disabled.
sesc_simulation_mark 2 (simulated) @30297741
White(1): noise level set to 0.
sesc_simulation_mark 3 (simulated) @30321294
White(1): search time set to 99999.00.
sesc_simulation_mark 4 (simulated) @30423503
White(1): verbosity set to 5.
sesc_simulation_mark 5 (simulated) @30448854
White(1): sesc_simulation_mark 6 (simulated) @30749824
White(1): search depth set to 2.
sesc_simulation_mark 7 (simulated) @30766129
White(1): 
              clearing hash tables

              depth   time  score   variation (1)
                1   ###.##  -0.67   axb5 c6xb5
                1   ###.##  -0.08   a4a5
sesc_simulation_mark 8 (simulated) @33088601
                1-> ###.##  -0.08   a4a5
                2   ###.##     --   a4a5
                2   ###.##  -0.65   a4a5 f6f5
                2   ###.##  -0.58   axb5 c6xb5 Ne4c5
                2   ###.##  -0.46   Rf1c1 f6f5
                2   ###.##  -0.43   Ra1c1 f6f5
sesc_simulation_mark 9 (simulated) @37835727
                2-> ###.##  -0.43   Ra1c1 f6f5
              time:###  cpu:###  mat:-1  n:833  nps: ####
              ext-> checks:18 recaps:4 pawns:0 1rep:6
              predicted:0  nodes:833  evals:372
              endgame tablebase-> probes done: 0  successful: 0
              hashing-> trans/ref:17%  pawn:83%  used:w0% b0%

White(1): Ra1c1 
              time used: ###.##
sesc_simulation_mark 10 (simulated) @38876482
Black(1): execution complete.

以上でオプションを指定しない場合のSESCのコンパイルは終了である.

一覧