FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

Facetsでプロセッサベンチマークソフトウェアの解析を試行した話2

引き続き、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で表示させてみた。

横軸が読み込みレジスタアドレス、縦軸が書き込みレジスタアドレスなので、

  • レジスタアドレス0-3と、アドレス13-15に書き込みが発生しやすい。
  • レジスタアドレス0-3が、読み込みアドレスとしては圧倒的に使用される。

ということが分かってくるだろう。

f:id:msyksphinz:20171011002219g:plain

最内周ループの探索

PCでソートして、最も実行される命令を探索してみた。

f:id:msyksphinz:20171011002809g:plain

PC=0x1984 ~ 0x1992くらいが最頻で実行されるPCだなー。このへんが最内周ループか。分類してみると、分岐がやはり多いイメージだな。