引き続き、Facetsで遊んでいる。現在はDhrystoneプログラムを解析中。
レジスタ読み込みアドレスとレジスタ書き込みアドレスの関係を調査していたのだが、いくつか読み込ませるデータを変更して、より解析しやすくしてみた。
sed 's/C0://g' output/dhrystone.riscv.out | \ grep "\[1\] pc" | \ sed "s/inst=\(.*\)\] \(.*\)$/\inst=\1| \ \2/g" | sed 's/\]/|/g' | \ sed 's/pc=\[//g' | \ sed 's/W\[//g' | \ sed 's/R\[//g' | \ sed 's/inst=\[//g' | \ sed 's/|\[/| /'g | \ sed 's/\[/| /g' | \ sed 's/r *\([0-9]*\)=/\1|/g' > output/dhrystone.riscv.en.csv awk -F'|' '{OFS="|"; if($6 == 0){ $4=""; $5=""; } print $0}' dhrystone.riscv.en.csv > dhrystone.riscv.en2.csv
詳細は省略するが、レジスタ書き込みを起こさない命令については、書き込みアドレスの情報を削り取ってしまい、無意味な情報はFacetsで可視化されないようにする。
- dhrystore.riscv.en2.csv の中身
... 151863 | 1| 0000000344| 8|0000000080002a48| 1| 8|0000000080002a40| 8|0000000080005113| 00840413| addi s0, s0, 8 151864 | 1| 0000000348||| 0| 8|0000000080002a48| 9|0000000080005110| fe941ce3| bne s0, s1, pc - 8 <-- 書き込みを発生させないプログラムは、フィールドを空白にする。 151865 | 1| 0000000340||| 0| 8|0000000080002a48| 0|0000000000000000| 00043023| sd zero, 0(s0) 151866 | 1| 0000000344| 8|0000000080002a50| 1| 8|0000000080002a48| 8|0000000080005113| 00840413| addi s0, s0, 8 151867 | 1| 0000000348||| 0| 8|0000000080002a50| 9|0000000080005110| fe941ce3| bne s0, s1, pc - 8 151868 | 1| 0000000340||| 0| 8|0000000080002a50| 0|0000000000000000| 00043023| sd zero, 0(s0) 151869 | 1| 0000000344| 8|0000000080002a58| 1| 8|0000000080002a50| 8|0000000080005113| 00840413| addi s0, s0, 8
これで再度Facetsで表示させてみた。
横軸が読み込みレジスタアドレス、縦軸が書き込みレジスタアドレスなので、
ということが分かってくるだろう。
最内周ループの探索
PCでソートして、最も実行される命令を探索してみた。
PC=0x1984 ~ 0x1992くらいが最頻で実行されるPCだなー。このへんが最内周ループか。分類してみると、分岐がやはり多いイメージだな。