Chipyardの4コアコンフィグレーションを使用してAtomic命令の動作をシミュレートする。
テストとして以下のようなプログラムを作り、4コアが同じキャッシュラインを更新していくことを確認していきたい。
int global = 0; static inline void amoadd_d() { int ret; asm volatile ("amoadd.w %0, %1, %2" : "=r"(ret) : "r"(1), "m"(global)); } unsigned long data = 0x3421L; int main(void) { for (int i = 0; i < 100; i++) { amoadd_d(); } return 0; } int __main(void) { for (int i = 0; i < 100; i++) { amoadd_d(); } return 0; }
__main()
はコア0以外のコアが実行するためのmain()
関数で、Weak定義してあるので明示的に定義することで有効化できる。
make debug CONFIG=QuadRocketConfig
./simulator-chipyard-QuadRocketConfig-debug +verbose -v accum.quad.vcd ../../tests/amoadd.riscv 2>&1 | spike-dasm | tee amoadd.quad.log
amoadd.w
命令の動作を観察する。
grep amo amoadd.quad.log
C3: 11190 [1] pc=[0000000080000240] W[r12=0000000000000184][1] R[r13=00000000800006a0] R[r14=0000000000000001] inst=[00e6a62f] amoadd.w a2, a4, (a3) C2: 11244 [1] pc=[0000000080000240] W[r12=0000000000000185][1] R[r13=00000000800006a0] R[r14=0000000000000001] inst=[00e6a62f] amoadd.w a2, a4, (a3) C1: 11298 [1] pc=[0000000080000240] W[r12=0000000000000186][1] R[r13=00000000800006a0] R[r14=0000000000000001] inst=[00e6a62f] amoadd.w a2, a4, (a3) C3: 11294 [1] pc=[0000000080000240] W[r12=0000000000000187][1] R[r13=00000000800006a0] R[r14=0000000000000001] inst=[00e6a62f] amoadd.w a2, a4, (a3) C2: 11348 [1] pc=[0000000080000240] W[r12=0000000000000188][1] R[r13=00000000800006a0] R[r14=0000000000000001] inst=[00e6a62f] amoadd.w a2, a4, (a3) C1: 11402 [1] pc=[0000000080000240] W[r12=0000000000000189][1] R[r13=00000000800006a0] R[r14=0000000000000001] inst=[00e6a62f] amoadd.w a2, a4, (a3) C3: 11375 [1] pc=[0000000080000240] W[r12=000000000000018a][1] R[r13=00000000800006a0] R[r14=0000000000000001] inst=[00e6a62f] amoadd.w a2, a4, (a3) C2: 11429 [1] pc=[0000000080000240] W[r12=000000000000018b][1] R[r13=00000000800006a0] R[r14=0000000000000001] inst=[00e6a62f] amoadd.w a2, a4, (a3) C1: 11483 [1] pc=[0000000080000240] W[r12=000000000000018c][1] R[r13=00000000800006a0] R[r14=0000000000000001] inst=[00e6a62f] amoadd.w a2, a4, (a3) C3: 11456 [1] pc=[0000000080000240] W[r12=000000000000018d][1] R[r13=00000000800006a0] R[r14=0000000000000001] inst=[00e6a62f] amoadd.w a2, a4, (a3) C2: 11533 [1] pc=[0000000080000240] W[r12=000000000000018e][1] R[r13=00000000800006a0] R[r14=0000000000000001] inst=[00e6a62f] amoadd.w a2, a4, (a3) C1: 11617 [1] pc=[0000000080000240] W[r12=000000000000018f][1] R[r13=00000000800006a0] R[r14=0000000000000001] inst=[00e6a62f] amoadd.w a2, a4, (a3)
一応上手く行っているようだ。波形の詳細解析は今後。