
Gem5のサイクルモードについて基本をつかんだので、次は問題となるベクトル命令を動かしてみたい。ユーザモードで以下のようなmemcpyのコードを含む
プログラムをコンパイルして、main()で囲んで実行してみた。
.text
.global copy_data_vec
# void copy_data_vec(int8_t *dest_data, int8_t *source_data, int data_num);
# a0=dest, a1=src, a2=n
#
copy_data_vec:
mv a3, a0 # Copy destination
.loop:
vsetvli t0, a3, e8,m1 # Vectors of 8b
vle8.v v0, (a1) # Load bytes
add a1, a1, t0 # Bump pointer
sub a2, a2, t0 # Decrement count
vse8.v v0, (a3) # Store bytes
add a3, a3, t0 # Bump pointer
bnez a2, .loop # Any more?
ret # Return
.global copy_data_mask_vec
# void copy_data_mask_vec(int8_t *dest_data, int8_t *source_data, int8_t *mask, int data_num);
# a0=dest, a1=src, a2=n
#
copy_data_mask_vec:
li t1, 8 # calculate element length of mask, VLEN=512 / ELEN=8 / 8-bit
_loop:
vsetvli t0, t1, e8,m1 # Vectors of 8b
vle8.v v0, (a2)
add a2, a2, t0
vsetvli t0, a3, e8,m1 # Vectors of 8b
vle8.v v1, (a1), v0.t # Load bytes
add a1, a1, t0 # Bump pointer
sub a3, a3, t0 # Decrement count
vse8.v v1, (a0), v0.t # Store bytes
add a0, a0, t0 # Bump pointer
bnez a3, _loop # Any more?
ret # Return
結果は以下の通りだ。やはりだめらしい。
./build/RISCV/gem5.debug --debug-flags=O3PipeView --debug-file=printf.out configs/example/se.py --cpu-type=DerivO3CPU --caches -c /home/msyksphinz/work/gem5/gem5_test/memcpy_vector/memcpy_vector
build/RISCV/sim/simulate.cc:194: info: Entering event queue @ 0. Starting simulation... build/RISCV/sim/mem_state.cc:443: info: Increasing stack size by one page. build/RISCV/sim/syscall_emul.cc:74: warn: ignoring syscall mprotect(...) build/RISCV/arch/riscv/faults.cc:188: panic: Unknown instruction 0x0006f2d7 at pc (0x10922=>0x10926).(0=>1) Memory Usage: 640732 KBytes Program aborted at tick 11481000 --- BEGIN LIBC BACKTRACE --- ./build/RISCV/gem5.debug(+0x62dfa1)[0x564cbad08fa1] ./build/RISCV/gem5.debug(+0x6563c2)[0x564cbad313c2] /lib/x86_64-linux-gnu/libpthread.so.0(+0x14420)[0x7fc896ac1420] /lib/x86_64-linux-gnu/libc.so.6(gsignal+0xcb)[0x7fc89606300b] /lib/x86_64-linux-gnu/libc.so.6(abort+0x12b)[0x7fc896042859]