• 検索結果がありません。

Nios II カスタム・インストラクションによるキャスト(型変換)の高速化

N/A
N/A
Protected

Academic year: 2021

シェア "Nios II カスタム・インストラクションによるキャスト(型変換)の高速化"

Copied!
14
0
0

読み込み中.... (全文を見る)

全文

(1)

Nios II カスタム・インストラクションによるキャスト(型変換)の高速化

ver. 9.1 2009 年 12 月

1. はじめに

Nios® II にオプションで実装できる浮動小数演算カスタム・インストラクションは、浮動小数四則演算はサポートしているもの の、整数から浮動小数にキャスト(型変換)する機能やその逆の機能は備えていません。この資料では、単精度浮動小数型と 整数型の変換を簡単に Nios II のカスタム・インストラクションに実装する方法を紹介しています。

なお、この手法を応用することで、MegaCore® Function で用意されている平方根 (ALTFP_SQRT) や対数 (ALTFP_LOG)、 指数関数 (ALTFP_EXP) なども実装することができます。

2. 対象となるバージョン

Quartus® II Version 9.1

(2)

3. 操作方法

3-1. ベース・プロジェクトの作成

Nios II が動作する Quartus II プロジェクトをあらかじめ用意してください。

3-2. MegaWizard™ Plug-In Manager を使用した HDL ソース・ファイルの生成

① Quartus II の Tools メニュー ⇒ “MegaWizard Plug-In Manager…” を選択し、表示された “MegaWizard Plug-In Manager [page 1]” で “Create a new custom megafunction variation” を指定し “Next” をクリックします。

② “MegaWizard Plug-In Manager [page 2a]” が表示されたら、“Arithmetic” を展開し、“ALTFP_CONVERT” を選択します。 その後、生成する HDL タイプ、ファイル・パスおよびファイル名を設定し “Next” をクリックします。ここでは浮動小数か ら整数に変換するHDL を ftoi.v として生成します。

(3)

③ “MegaWizard Plug-In Manager [page 3 of 7]” の ALTFP_CONVERT のダイアログが表示されたら、パラメータを下記の 設定にして “Finish” をクリックします。

Operation mode : A floating point to an integer Integer data : 32bit

Input floating point Settings : Single precision(32bit) Output floating point Settings : 設定無効

(4)

Optional inputs : Create a clock enable port

④ 同様に、整数から浮動小数に変換する HDL を itof.v として生成します。 Operation mode : An integer to a floating point

(5)

Input floating point Settings : 設定無効

Output floating point Settings : Single precision(32bit)

(6)

3-3. SOPC Builder でのカスタム・インストラクションのコンポーネントの登録

① Quartus II から SOPC Builder を起動し、File メニュー ⇒ “New Component…” を選択します。

② Component Editor で “HDL Files” タブを選択し、“Add…” をクリック後、先ほど生成した ftoi.v を選択します。HDL に 問題が無ければ “Analyzing <ファイル名> Completed” ダイアログ・ボックスが表示されますので、“Close” をクリックし て閉じてください。

(7)

③ “Interfaces” タブを開いて “Custom Instruction Slave” を選択し、Clock Cycles に 7、Operands に 1 を設定します。 Clock Cycles はコアの実行から結果が出力されるまでのクロック数です。ALTFP_CONVERT の Pipeline は 6 ですの で(詳細は Floating Point Converter (ALTFP_CONVERT) Megafunction User Guide を参照してください)、+1 した 7 を 設定します。Operands は引数の数となりますので、入力値が一つの ALTFP_CONVERT は 1 を設定します。

(8)

④ “Signals” タブを選択し、clk_en / clock / data / result を下記のように設定します。

⑤ 再び “Interfaces” タブに戻り、“Remove interfaces With No Signals” ボタンが有効になっていればクリックします。こうす ることで、割り当ての無いインタフェースを削除することができます。

⑥ “Component Wizard” タブを選択し、“Class Name” や “Display Name”、“Group” などを設定後、“Finish…” ボタンをク リックして閉じます。

(9)

⑧ SOPC Builder の “Nios II Processor” を開き、“Custom Instructions” タブを選択します。先ほどの Component Editor で 追加した ftoi と itof が左側のリストに表示されますので、選択して “Add…” をクリックして右側のリストに追加します。

⑨ “Finish” ボタンをクリックして、カスタム・インストラクションの登録は完了です。SOPC Builder において Generate 実行を し、その後 Quartus II でコンパイルしてください。

(10)

3-4. Nios II IDE (

Integrated Development Environment)

でのカスタム・インストラクションの実装

① Nios II IDE を起動後、新規にプロジェクトを生成し、Build します。

② “system.h” を確認して、登録したカスタム・インストラクションのマクロが存在するか確認します。 FTOI(浮動小数→整数変換)が 0 番、ITOF(整数→浮動小数変換)が 1 番で登録されていることが分かります。 ③ 動作を確認するため main 関数を下記のように記述して実行してください。 コンソールに ftoi=12345 itof=12345.0000000 と表示されれば正常に動作しています。 カスタム・インストラクションのマクロは、引数と戻り値の型により下記のような記述が可能です。 __builtin_custom_ <戻り値の型> n <第一引数の型><第二引数の型>(カスタム・インストラクション番号、引数…) 例えば、戻り値が int 型、第一引数が単精度小数型、第二引数が整数型の場合、下記の記述になります。 __builtin_custom_infi また、引数が一つしか無い場合には、最後の文字を省略し、 __builtin_custom_inf 戻り値が無い場合には、n の前の文字を省略します。 __builtin_custom_nf : : /*

* custom instruction macros *

*/

#define ALT_CI_FTOI_INST_N 0x00000000

#define ALT_CI_FTOI_INST(A) __builtin_custom_ini(ALT_CI_FTOI_INST_N,(A)) #define ALT_CI_ITOF_INST_N 0x00000001

#define ALT_CI_ITOF_INST(A) __builtin_custom_ini(ALT_CI_ITOF_INST_N,(A)) : : #include <stdio.h> #include "system.h" int main() { int n = 0; float f = 1234.5678; n = __builtin_custom_inf(ALT_CI_FTOI_INST_N, f); printf("ftoi=%d¥n", n); f = __builtin_custom_fni(ALT_CI_ITOF_INST_N, n); printf("itof=%f¥n", f); return 0; } 型 記述 int n float f void * p

(11)

④ 続いて、C 言語のキャスト記述でカスタム・インストラクションが実行されるよう、コンパイル・フラグを設定します。 アプリケーション・プロジェクトの Properties を開いて、“Compile Flags” に “-mcustom-fixsi=0 -mcustom-floatis=1” と設 定します。-mcustom-fixsi は浮動小数から整数への変換のためのカスタム・コンポーネント(FTOI)の番号(0)を指定し、 -mcustom-floatis は整数から浮動小数への変換のためのカスタム・コンポーネント (ITOF) の番号 (1) を指定します。 ⑤ main 関数を下記のように変更して実行してください。 ⑥ 正常に動作していることが確認できたら、カスタム・インストラクションで動作しているかを確認するため、Debug で起動し ます。 #include <stdio.h> #include "system.h" int main() { int n = 0; float f = 1234.5678; n = (int)f; printf("%d¥n", n); f = (float)n; printf("%f¥n", f); return 0; }

(12)

⑦ Debug 画面に切り替わったら、“Disassembly” ウィンドウを確認してください。下記のように、カスタム・インストラクション が呼ばれるようになっていれば正常です。

(13)

4. 補足

4-1. 性能比較

単精度浮動小数による各種の演算を、ソフトウェアとハードウェアで実行した際の動作クロックの比較です。検証は下記の構 成で行っています。

Device : Cyclone III EP3C120F780C7 Processor core : Nios II/f 100MHz

Instruction Memory : On-Chip RAM (Tightly Coupled instruction bus) Data Memory : On-Chip RAM (Tightly Coupled data bus)

Optimize option : -O3

カスタム・インストラクション実装時(us) 演算 ソフトウェア実行時(us) 標準四則演算 型変換コア追加時 各演算コア追加時 + 3.400 0.130 0.130 0.130 - 3.632 0.120 0.120 0.120 * 3.551 0.140 0.140 0.140 / 5.536 0.370 0.370 0.370 (int) 0.953 0.974 0.090 0.090 (float) 2.811 2.853 0.090 0.090 sqrtf() 6.031 5.553 5.561 0.190 logf() 97.791 9.691 9.760 0.240 expf() 90.228 12.340 12.250 0.200 型変換をソフトウェアで実装した場合と比べ、整数型変換では10 倍、浮動小数型変換では 31 倍の高速化が実現できていま す。また、平方根 (sqrt) でも 31 倍、対数 (log) では 407 倍、指数関数 (exp) では 451 倍もの大幅な高速化が可能です。 なお、上記の計測結果はシステムの構成によって変動する場合がありますので、参考値としてお考えください。

(14)

横浜本社 〒222-8563 横浜市港区新横浜 1-5-5 マクニカ第二ビル TEL 045-476-2155 FAX 045-476-2156 大阪営業所 〒532-0003 大阪市淀川区宮原 3-4-30 ニッセイ新大阪ビル 17 階 TEL 06-6397-1053 FAX 06-6397-1054 名古屋営業所 〒460-0003 名古屋市中区錦 1-6-5 名古屋錦シティビル 7 階 TEL 052-202-1024 FAX 052-202-1025 宇都宮営業所 〒321-0953 宇都宮市東宿郷 4-2-24 センターズビル 7 階 TEL 028-637-4488 FAX 028-637-4489 弊社より資料を入手されましたお客様におかれましては、下記の使用上の注意を一読いただいた上でご使用ください。 1. 本資料は非売品です。許可無く転売することや無断複製することを禁じます。 2. 本資料は予告なく変更することがあります。 3. 本資料の作成には万全を期していますが、万一ご不明な点や誤り、記載漏れなどお気づきの点がありましたら、弊社までご一報いただければ幸いです。 4. 本資料で取り扱っている回路、技術、プログラムに関して運用した結果の影響については、責任を負いかねますのであらかじめご了承ください。 5. 本資料は製品を利用する際の補助的な資料です。製品をご使用になる場合は、英語版の資料もあわせてご利用ください。

参照

関連したドキュメント

SD カードが装置に挿入されている場合に表示され ます。 SD カードを取り出す場合はこの項目を選択 します。「 SD

マーカーによる遺伝子型の矛盾については、プライマーによる特定遺伝子型の選択によって説明す

WAV/AIFF ファイルから BR シリーズのデータへの変換(Import)において、サンプリング周波 数が 44.1kHz 以外の WAV ファイルが選択されました。.

LLVM から Haskell への変換は、各 LLVM 命令をそれと 同等な処理を行う Haskell のプログラムに変換することに より、実現される。

回転に対応したアプリを表示中に本機の向きを変えると、 が表 示されます。 をタップすると、縦画面/横画面に切り替わりま

※ログイン後最初に表示 される申込メニュー画面 の「ユーザ情報変更」ボタ ンより事前にメールアド レスをご登録いただきま

QRコード読込画面 が表示されたら、表 示された画面を選択 してウインドウをアク ティブな状態にした 上で、QRコードリー

Altera Nios II フォルダを展開し、Existing Nios II software build tools project or folder into workspace を選択します(図 2–9 を参 照)。.