S1coreとOpenSPARC T1純正環境との差分は引き続き調査中だ。 とりあえず、S1coreを使いこなせるようになりたい。 まずはベンチマークプログラムを動作させられるようにしたい。Coremarkが動けば面白いのだが、まずはDhrystoneかな。
Dhrystoneは、CPUの基本性能を知るための最も基礎的なベンチマークプログラムだ。
S1coreでプログラムを動作させるためには
前回少し解説したが、S1coreでベンチマークプログラムを動作させるためには、以下の2つのファイルを用意する必要がある。
rom_harness.hex: リセット後のブート動作を行うためのプログラム。main()に入る直前まで。ram_harness.hex:main()以降のプログラムを格納している。
まずは、S1coreのリリース群に入っているスクリプトを確認して、何をしなければならないのかを確認しよう。
$ less ./tools/bin/compile_test ... # Compile the boot code sparc64-linux-gnu-as -ah -am -o boot/boot.bin boot/boot.s sparc64-linux-gnu-objdump -d -EB -w -z boot/boot.bin > boot/boot.dump grep " " boot/boot.dump | egrep -v "elf64-sparc" | dump2hex.bin > boot/rom_harness.hex # Compile the C test sparc64-linux-gnu-gcc -c -O0 $1.c sparc64-linux-gnu-ld -Ur --script=$S1_ROOT/tools/src/linker.map -EB -o $1.bin $1.o sparc64-linux-gnu-objdump -d -EB -w -z $1.bin > $1.dump grep " " $1.dump | egrep -v "elf64-sparc" | dump2hex.bin > ram_harness.hex
基本的にsparcのgccを使ってコンパイルし、リンカはlinker.mapを使っている。これはDhrystoneも同じものを使えばよかろう。
このコンパイル手順をDhrystoneにも適用すれば良いと思われる。
Dhrystoneのコードは以下からダウンロードした。
Makefileの編集を行う。
CC= sparc64-linux-gnu-gcc # C compiler name goes here (UNIX) GCC= sparc64-linux-gnu-gcc ... CFLAGS= $(OPTIMIZE) $(TIME_FUNC) -DHZ=$(HZ) $(ENUMS) $(STRUCTASSIGN) $(CFL) -Ur -Xlinker --script=/home/masayuki/work/s1_core_opensparc_t1/s1_core/tools/src/linker.map -Xlinker -EB -lc GCCFLAGS= $(GCCOPTIM) $(TIME_FUNC) -DHZ=$(HZ) $(ENUMS) $(STRUCTASSIGN) $(CFL) -Ur -Xlinker --script=/home/masayuki/work/s1_core_opensparc_t1/s1_core/tools/src/linker.map -Xlinker -EB -lc
さらに、cc_dhryを作成した後に、hexファイルを生成する手順も追加した。
cc_dry2: $(SRC) $(HDR)
$(CC) $(CFLAGS) $(SRC) $(LFLAGS) -o $@
sparc64-linux-gnu-objdump -d -EB -w -z $@ > $@.dump
grep " " $@.dump | egrep -v "elf64-sparc" | dump2hex.bin > ram_harness.hex
これで、Dhrystoneのディレクトリにram_harness.hexが生成される。これを既存のs1_core/test/ram_harness.hex (hello.cから生成したもの)と置き換えてシミュレーションを走らせて見ればよい。