Nios® II 高速化手法シリーズ
このシリーズでは Nios® II プロセッサーの高速化に役に立つ情報について紹介します。
目的
Nios® II 単体では浮動小数演算の回路は実装しておりませんので浮動小数の演算はソフトウェア演算となります。そこで、浮動小数演算を多用するソフトウェアのため、浮動小数演算カスタム・インストラクションを利用して高速化を図る事が可能です。
しかし、カスタム・インストラクションを実装する事で全ての演算が高速になるわけではありません。コンパイル済のライブラリーや、単精度と倍精度が混在したものなど、カスタム・インストラクションが動作する条件は、ハードウェアの実装の状況やコンパイラーなどに依存します。
本資料では、Whetstone ベンチマークを使い、カスタム・インストラクションの有無や、その実装によってどのような性能向上が見込めるのか、また、カスタム・インストラクションを使用する上での注意点などを纏めています。
なお、計測結果の数値につきましては、ハードウェアの構成だけでなく、コンパイラーやコンパイラーのバージョンによっても大幅に変わりますので、傾向を示す参考数値として理解してください。
本検証では、3つのカスタム・インストラクションを実装して計測を行っています。
(1) 単精度四則演算のみを実装した altera_nios_custom_instr_floating_point
[ altera_nios_custom_instr_floating_point Parameter ]
(2) 上記に加え、ルートや比較、変換などを実装した altera_nios_custom_instr_floating_point_2
[altera_nios_custom_instr_floating_point_2 Parameter ]
また、カスタム・インストラクションは独自に作成する事も可能ですので、倍精度浮動小数演算を実装したモジュールも評価に加えています。
(3) 倍精度四則演算、比較、変換を実装したオリジナルのカスタム・インストラクション
作り方につきましては、こちらで紹介しております。
Whetstone benchmark
Whetstone は、CPU の浮動小数演算性能を測るベンチマーク・プログラムです。それに対し、Dhrystone 2.1 は、整数演算における CPU のベンチマーク・プログラムです。ベンチマークする演算は四則演算だけでなく三角関数や対数なども含みます。
Whetstone は本来、倍精度浮動小数演算の性能を測るためのものですが、本検証の中では単精度浮動小数演算に対しても計測を行っています。
計測方法
計測対象は Cyclone® V を使用し、ツールはインテル® Quartus® Prime 開発ソフトウェア・スタンダード・エディション v18.1 、Nios® II Software Build Tools (SBT) for Eclipse を使用しています。
デザインやソフトウェアは Nios® II を動作させる最小のものとし、下記の条件で作成しています。
基本条件
- Nios® II コアは Gen2 Nios II/f を使用
- クロックは 100MHz
- Cache は Instruction / Data 共に 4KB、Burst や Tightly Coupled Memory (TCM) は Disable
- 演算命令のハードウェア実装は全て
- Onchip-RAM 196MB のプログラムメモリー
- ペリフェラルは、JTAG UART、PIO x 2、Time Stamp Timer 用 Interval Timer のみとし、IRQ は Timer = 0、JTAG UART = 31 とする
- プラットフォーム・デザイナーの Pipeline Stage は 0 とし、Clock Crossing Adapter Type は Auto とする
ソフトウェアの設定
ソフトウェアは Dhrystone 2.1 のみとして、計測中に割り込みが入らない設定としています。
- sys_clk_timer は実装せず、timestamp_timer を計測用タイマーとして実装
- ライブラリーやドライバーは標準のものを使用(reduse device driver でない)
- オプティマイズ・レベルはアプリケーションおよびライブラリー共に -O3
- ツールチェーンは MinGW Nios® II GCC4 を使用
計測バリエーション
基本条件に対し下記の変更を加え計測しました。
- カスタム・インストラクションは未実装
- (1) の altera_nios_custom_instr_floating_point を実装して計測
- (2) の altera_nios_custom_instr_floating_point_2 を実装して計測
- (3) のオリジナル倍精度浮動小数演算カスタム・インストラクションを実装して計測
計測結果
評価方法 | 倍精度 MIPS | 単精度 MIPS | 使用リソース | ||
ALM | Memory | DSP | |||
1. | 9.1 | 6.2 | 0.0 | 0 | 0 |
2. | 9.1 | ※27.1 | 972.7 | 15,904 | 4 |
3. | 9.1 | 6.7 | 2,442.9 | 1,281 | 1 |
4. | ※116.7 | 6.7 | ※32,148.5 | 389,120 | 19 |
評価
※1 倍精度演算では、倍精度カスタム・インストラクションの効果が大きく、単精度カスタム・インストラクションの効果はあまり無い結果となりました。
※2 単精度演算では、altera_nios_custom_instr_floating_point_2 の実装の効果が若干大きいようですが、ベンチマークの実行時間の大半を占める三角関数や対数演算にカスタム・インストラクションが使用されないため、大幅な性能向上には至っていません。ただし、四則演算のみを大量に実行するようなアプリケーションの場合は効果は高いと考えられます。なお、単精度より倍精度の方が演算性能が高いのは、 演算ライブラリーの多くは倍精度で演算し、結果を単精度にキャストして出力しているためと考えられます。
※3 リソースに余裕があるのであれば、倍精度カスタム・インストラクションを実装し、特に負荷の高い演算(三角関数や対数など)についてもカスタム・インストラクションで実装する事で、大幅な性能向上が見込めると考えられます。
おすすめページ
弊社では Nios® II に関する各種情報とまとめた「Nios® II まとめページ」をご用意しております。本記事以外にも有用な情報が満載ですのでこちらも併せてご確認ください。