前回の続き:
ビルドオプションの変更
FPに対応するため、ビルドオプションを変更した。
riscv64_config.cfg
runlist = int fp
strict_rundir_verify = 0
monitor_wrapper = qemu-riscv64 -L /riscv-linux/sysroot $command
default:
CC = riscv64-unknown-linux-gnu-gcc -std=gnu89
CXX = riscv64-unknown-linux-gnu-g++
FC = riscv64-unknown-linux-gnu-gfortran
CC_VERSION_OPTION = --version
CXX_VERSION_OPTION = --version
FC_VERSION_OPTION = --version
default:
# Language-specific OPTIMIZE only (no global OPTIMIZE), so C-only flags are not passed to gfortran
COPTIMIZE = -g -Ofast -funroll-loops -flto -flto-partition=one -fno-builtin-memcpy -fno-builtin-memmove
CXXOPTIMIZE = -g -Ofast -funroll-loops -flto -flto-partition=one -fno-builtin-memcpy -fno-builtin-memmove
FOPTIMIZE = -g -Ofast -funroll-loops -flto
EXTRA_OPTIMIZE = -mabi=lp64d
EXTRA_FFLAGS = -mabi=lp64d
PORTABILITY = -DSPEC_CPU_LP64
FPORTABILITY = -DSPEC_CPU_LP64
LDCXXFLAGS = -Wl,--allow-multiple-definition
テストベンチとしては、 410.bwaves と 433.milc を使用してみた。
410.bwaves は、ビルドはできるようだが、シミュレーションが失敗するようだ。
Running Benchmarks
Running 410.bwaves ref base gcc default
410.bwaves: copy 0 non-zero return code (exit code=11, signal=0)
****************************************
Contents of bwaves.err
****************************************
Segmentation fault (core dumped)
****************************************
Error: 1x410.bwaves
Producing Raw Reports
mach: default
ext: gcc
size: ref
set: int
set: fp
format: raw -> /home/kimura/work/bench_trace/bench_trace_env/spec2006_work/spec2006_installed/result/CFP2006.066.ref.rsf
Parsing flags for 410.bwaves base: done
Doing flag reduction: done
format: CSV -> /home/kimura/work/bench_trace/bench_trace_env/spec2006_work/spec2006_installed/result/CFP2006.066.ref.csv
The log for this run is in /home/kimura/work/bench_trace/bench_trace_env/spec2006_work/spec2006_installed/result/CPU2006.066.log
The debug log for this run is in /home/kimura/work/bench_trace/bench_trace_env/spec2006_work/spec2006_installed/result/CPU2006.066.log.debug
433.milc の方は一応、シミュレーションは動き出したようだ。
410.bwaves のシミュレーションで落ちる
確かに、410.bwavesを実行してみると、Segmentation Faultで落ちた。
../../../../../../../qemu-9.2.4/build/qemu-riscv64 -L /riscv-linux/sysroot ../run_base_ref_gcc.0000/bwaves_base.gcc Segmentation fault (core dumped)
これをGDBで見てみようと思い、接続してみた。
- (サーバ側)
../../../../../../../qemu-9.2.4/build/qemu-riscv64 -g 8888 -L /riscv-linux/sysroot ../run_base_ref_gcc.0000/bwaves_base.gcc
- (クライアント側)
$ gdb (gdb) target remote :8888 Remote debugging using :8888 warning: while parsing target description (at line 1): Target description specified unknown architecture "riscv:rv64" warning: Could not load XML target description; ignoring Reading /home/kimura/work/bench_trace/bench_trace_env/spec2006_work/spec2006_installed/benchspec/CPU2006/410.bwaves/run/run_base_ref_gcc.0000/bwaves_base.gcc from remote target... warning: File transfers from remote targets can be slow. Use "set sysroot" to access files locally instead. Reading /home/kimura/work/bench_trace/bench_trace_env/spec2006_work/spec2006_installed/benchspec/CPU2006/410.bwaves/run/run_base_ref_gcc.0000/bwaves_base.gcc from remote target... Reading symbols from target:/home/kimura/work/bench_trace/bench_trace_env/spec2006_work/spec2006_installed/benchspec/CPU2006/410.bwaves/run/run_base_ref_gcc.0000/bwaves_base.gcc... Truncated register 37 in remote 'g' packet
あら、これは riscv64-unknown-linux-gnu-gdb を使う必要があるらしい。
- (サーバ側)
../../../../../../../qemu-9.2.4/build/qemu-riscv64 -g 8888 -L /riscv-linux/sysroot /home/kimura/work/bench_trace/bench_trace_env/spec2006_work/spec2006_installed/benchspec/CPU2006/410.bwaves/run/run_base_ref_gcc.0000/bwaves_base.gcc
- (クライアント側)
riscv64-unknown-linux-gnu-gdb /home/kimura/work/bench_trace/bench_trace_env/spec2006_work/spec2006_installed/benchspec/CPU2006/410.bwaves/run/run_base_ref_gcc.0000/bwaves_base.gcc (gdb) target remote :8888 Remote debugging using :8888 Reading symbols from /riscv-linux/sysroot/lib/ld-linux-riscv64-lp64d.so.1... (No debugging symbols found in /riscv-linux/sysroot/lib/ld-linux-riscv64-lp64d.so.1) 0x00001465080d9a26 in _start () from /riscv-linux/sysroot/lib/ld-linux-riscv64-lp64d.so.1
(gdb) bt
#0 0x00001465080d9a26 in _start () from /riscv-linux/sysroot/lib/ld-linux-riscv64-lp64d.so.1
#1 0x0000000000000000 in ?? ()
Backtrace stopped: frame did not save the PC
(gdb) continue
Continuing.
Program received signal SIGSEGV, Segmentation fault.
shell (re=100000, pr=0.71999999999999997, nx=65, ny=65, nz=64, nuim=0.10000000000000001, nuex2=0.10000000000000001, nuex4=0.050000000000000003, cfl=2, scheme=1,
conf=<optimized out>, ni=<optimized out>, maxit=0) at shell_lam.f:56
56 xyz(2,i,j,k)=t2
スタック不足で落ちているらしい。以下で修正できた。
../../../../../../../qemu-9.2.4/build/qemu-riscv64 -s 1024M -L /riscv-linux/sysroot /home/kimura/work/bench_trace/bench_trace_env/spec2006_work/spec2006_installed/benchspec/CPU2006/410.bwaves/run/run_base_ref_gcc.0000/bwaves_base.gcc