Zynq FPGAにはARMプロセッサが搭載されているため、もちろんタイマなどのレジスタ群も用意されている。 なかでも、性能評価屋さんが非常によく使うのが、サイクルカウンタだ。サイクルカウンタは現在までのサイクル数を計測し、レジスタに格納している。 これは性能計測をするのに非常に良く使われるレジスタだ。
ARMアーキテクチャにも、PMCCNTRというサイクルカウンタレジスタが定義されていた。
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0388fj/CIHJEEFA.html
このレジスタを使って性能評価環境を作ってみたいのだが、どのように実装すれば良いのだろうか。
コプロセッサレジスタを扱うための命令MRC, MCR
MRC命令はコプロセッサから汎用レジスタへの転送命令だ。Move to Register from Coprocessor の略かな?
op1{cond} coproc, #opcode1, Rt, CRn, CRm{, #opcode2} op2{cond} coproc, #opcode3, Rt, Rt2, CRm
一方、MCR命令は汎用レジスタからコプロセッサへの転送命令だ。こちらは Move to Coprocessor from Register の略なんだろうか。
op1{cond} coproc, #opcode1, Rt, CRn, CRm{, #opcode2} op2{cond} coproc, #opcode3, Rt, Rt2, CRm
これらの命令を使ったサイクルカウンタの使用方法が、以下のブログに載っていた。
KMC Staff Blog:Cortex-A9のサイクルカウンタを利用した簡単な実行時間の計測方法
asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r" (x));
CP15 c9レジスタがサイクルカウンタらしい。
これを使ってZynq ZedBoardのPS/PLの基本プログラムを使ってサイクル数を計測してみよう。