目的

XilinxのFPGAにはMicroBlazeというソフトウェアのプロセッサがある。ソフトウェアなので乗算器や除算器を必要に応じて装備させることが可能です。乗算器は使用するハードウェアの量が多いので、なるべくなら装備しないことを考えたいが、一体、どれくらい違うのかを考えるためMicroBlazeのソフトウェア乗算のコードを調べる。実際には乗算器にDSPを利用する場合が多いのでDSPが余っているような状況ではあまり必要のない議論かもしれない。

MicroBlazeの乗算器の性能

性能を優先するパイプライン5段のMicroBlazeでは1サイクルのレイテンシで、面積を優先するパイプライン3段のMicroBlazeでは3サイクルのレイテンシ。

32bit×32bit = 64bitのソフトウェア乗算

MicroBlazeのSDKのgccのライブラリに加算器を駆使したソフトウェアの乗算ルーチンがある。

mulsi3.o:     file format elf32-microblazeel


Disassembly of section .text:

00000000 <__mulsi3>:
   0:   00600000    add r3, r0, r0
   4:   bc05004c    beqi    r5, 76      // 50
   8:   bc060048    beqi    r6, 72      // 50
   c:   bea5000c    bgeid   r5, 12      // 18
  10:   88853000    xor r4, r5, r6
  14:   24a50000    rsubi   r5, r5, 0
  18:   bca60008    bgei    r6, 8       // 20
  1c:   24c60000    rsubi   r6, r6, 0
  20:   b8000008    bri 8       // 28
  24:   00a52800    add r5, r5, r5
  28:   90c60041    srl r6, r6
  2c:   08e00000    addc    r7, r0, r0
  30:   bc07fff4    beqi    r7, -12     // 24
  34:   be26fff0    bneid   r6, -16     // 24
  38:   00632800    add r3, r3, r5
  3c:   bc44000c    blti    r4, 12      // 48
  40:   b60f0008    rtsd    r15, 8
  44:   80000000    or  r0, r0, r0
  48:   b60f0008    rtsd    r15, 8
  4c:   04630000    rsub    r3, r3, r0
  50:   b60f0008    rtsd    r15, 8
  54:   20600000    addi    r3, r0, 0

コアとなるループはアドレス24~38の6命令。値によって1ループ 5~6サイクルになる。(1サイクルの遅延分岐)
乗数、被乗数の値に依存するが両者が32bitのMAXに近い場合、32×5.5 = 176サイクル
ただし実測ではないので、違っているかもしれない。

まとめ

ソフトウェアによる乗算は、かなり遅いことがわかった。

参考文献

Xilinx 「MicroBlaze プロセッサ リファレンス ガイド」
UG081(v10.3)

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.