暗号計算機屋のブログ

なにか思いついたことを不定期に更新。

MicroBlaze性能評価

目的

手っ取り早く自作CPUの性能を評価するためMicroBlazeと比較できるようにする。ベンチマークは自作CPUの性能を測るプログラムを簡単にするため、あまり意味はなく四則演算や論理演算、シフト命令が適当に入るような小さいものを自作した。FPGAの経験は浅いので結果についての取り扱いは注意されたし。

MicroBlazeの構成

FPGAバイス : Artix-7 35T Arty

性能型 面積型 最小型 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の乗算性能についての説明があって参考になります。

qiita.com