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]