目的
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)