目的
手っ取り早く自作CPUの性能を評価するためMicroBlazeと比較できるようにする。ベンチマークは自作CPUの性能を測るプログラムを簡単にするため、あまり意味はなく四則演算や論理演算、シフト命令が適当に入るような小さいものを自作した。FPGAの経験は浅いので結果についての取り扱いは注意されたし。
MicroBlazeの構成
性能型 | 面積型 | 最小型 | MCS型 | |
---|---|---|---|---|
Predefined Configuration |
microcontroller | Minimum Area | Minimum Area | - |
implementation optimization |
PERFORMANCE | AREA | AREA | AREA |
クロック | 166MHz | 166MHz | 166MHz | 166MHz |
WNS | 0.04 ns | 0.01 ns | 0.02 ns | 0.01 ns |
Debug Module | 〇 | 〇 | 〇 | 〇 |
Enable Barrel Shiffter |
〇 | 〇 | 〇 | × |
FPU | × | × | × | × |
Integer Multi | MUL32 | MUL32 | × | × |
Integer Divider | 〇 | 〇 | × | × |
Optimaization | PERFORMANCE | AREA | AREA | - |
Enable Branch Target Cache |
× | × | × | × |
S-RAM | 32KB | 32KB | 32KB | 32KB |
追加IP | AXI GPIO AXI Uartlite |
AXI GPIO AXI Uartlite |
AXI GPIO AXI Uartlite |
- |
GPIOはArtix-7 35Tの基板上のLED 4個と接続されている
実装面積
性能型 | 面積型 | 最小型 | MCS型 | |
---|---|---|---|---|
LUT | 1742 | 1512 | 1401 | 985 |
FF | 1582 | 1274 | 1142 | 747 |
BRAM | 8 | 8 | 8 | 8 |
DSP | 3 | 3 | 0 | 0 |
LUTRAM | 140 | 218 | 216 | 203 |
測定結果
パラメータ | 性能型 | 面積型 | 最小型 | MCS型 |
---|---|---|---|---|
ループ数10000000 除算割合 10 |
7.9 秒 | 10.5秒 | 41.7 秒 | 51.0 秒 |
ベンチマーク プログラム
#include <stdint.h> #include "xparameters.h" #include "xil_printf.h" #pragma GCC optimize("O2") uint32_t xor(void) { static uint32_t y = 2463534242; y = y ^ (y << 13); y = y ^ (y >> 17); return y = y ^ (y << 15); } uint32_t xors(int loop,int div) { int i; uint32_t a,b,c; uint64_t w; uint32_t r; r = 0; for(i=0 ; i<loop ; i++) { do { a = xor(); } while(a==0); do { b = xor(); } while(b==0); do { c = xor(); } while(c==0); w = a*b; if(i%div==0) w /= c; r += w; } return r; } #pragma GCC optimize("O0") int main() { xil_printf("START!\n"); uint32_t r = xors(10000000,10); xil_printf("%08X\n",r); return 0; }
ベンチマークの演算結果
gccのオプションでハードウェア乗算器、除算器、バレルシフタの有無の設定ができる。MicroBlazeの構成をもとに正しくgccのオプションを設定する。乗算器がない構成で乗算命令を行うと演算結果が0になる。正しい演算結果になっているか確認する。測定したパラメータでは 次のような値になる。 0x3EEF270E
乗算の部分は32bit×32bit = 64bit のつもりで作成したが64bitにキャストしていなかったため32bit × 32bit = 32bitというようにCコンパイラは解釈するみたいです。結果の性能は32bitのままデータの再収取はしませんが、64bitにキャストした場合の期待値は
0xFC3BB111
Intel CPUとの比較
Intel Celeron E7500(2.93GHz)では0.13秒
2930 ÷ 166.667 ≒ 17.58倍 E7500の周波数を166.667MHzに換算した場合は2.3秒
考察
乗算器、除算器がある場合、性能は格段に向上する。乗算器のゲート数はASICでは大きなものになるはずだがFPGAではDSPで実装されるため注意する。性能型はパイプライン段数5で面積型はパイプライン段数3なので、性能型のほうが周波数が高くてもいいはずなのだが、今回は同じ166MHzだった。Xilinxのサイト見ても周波数の差は少ないので合っているものとも思われる。乗算命令とシフト命令のレイテンシが性能型と面積型で異なることが、今回の測定結果に反映されたのかもしれない。乗算命令のレイテンシは性能型で1、面積型で3。シフト命令のレイテンシは性能型で1、面積型で2。 MCS型はMicroBlaze MCSのこと。機能固定で面積をさらに小さくしたものと思われる。機能面では最小型とバレルシフタの有無が異なる。この結果、同じ周波数だが、バレルシフタがある最小型のほうが高性能になっているものと思われる。
追記 2018年4月14日 次のURLでMicroBlazeの乗算性能についての説明があって参考になります。