やっと戻った

第4章
Impulse C の導入
安達ほのか
はじめに
• Impulse Cは通信プロセスプログラミングモデルを使用することによ
り、並列で複雑なハードウェア/ソフトウェアアルゴリズムとアプリ
ケーションの開発をサポートすることができる。
Impluse C の起源について
• ロスアラモス国立研究所のマヤ・ゴーカレー博士
• Streams-Cの商用化であり、 FPGAベースの基盤レベルプラットホー
ムで実現のアプリケーションを表現するメソッドを提供。
• Streams-Cを使用することで、データ暗号化、イメージプロセッシン
グ、天体物理学などの分野でアプリケーションが開発された。
※ Streams-C
一般に公開されているC言語のコンパイラ
• Impluse CとStreams-Cの相違点
→標準のCプログラミング環境との互換性を維持
Impluse Cライブラリは標準のC開発ツールを使用する
ことで行動全体をシミュレートすることができる。
Impulse Cライブラリは、独自に連動している過程から
成る並行なアプリケーションの編集とシミュレーション
をするために、過程インタコネクト(ストリームなシグナ
ルの相互連絡)を定義する機能を含み、スレッドを使
用することで複数の過程(デスクトップシミュレーション
の目的のための)の動きをエミュレートする。
• Impulse Cツールはソフトウェアからハードウェアへ
のコンパイラを含んでいる。
• そのコンパイラは、個々のImpulse Cプロセスを、機
能上同等なハードウェア記述に変換して、必要不可
欠なプロセスからプロセスへのインタフェース論理を
生成する。
4.1
• Impulse Cの目的
高度な並行動作アプリケーションを可能にすること
• このマルチプロセッサ(並行アプローチ)はFPGA基盤の
組み込みシステムに適している
• ストリーム、シグナル、メモリーへのサポートは
それぞれのデータタイプに関連付けられたCコンパチブル(互換性
のある)組み込み関数を経由してImpulse Cに提供する。
• ハードウェアに写像する過程において、C言語はCの部分集合
に抑制される。一方ソフトウェアの過程は、ホストかImpulse C
コンパイラの制限で抑制される。
• Impulse Cコンパイラはハードウェアの過程のために、指定
されたストリーム、シグナル、およびメモリーを実行しなが
ら統合された HDL(ハードウェア記述言語)を作り出す。
• コンパイラは命令スケジューリング、ループのパイプライン
処理、およびループ変換(プログラムのサイズを犠牲に実
行速度を最適化すること)を実行する。
• Impulse Cソフトウェア・ライブラリはコンパイルに
ビジュアルスタジオのようなスタンダードC
開発ツールを使うと、 Impulse Cアプリケーション
の並列な動きのデスクトップエミュレーションや
シミュレーションをサポートする。
• Impulse Cライブラリは複数の埋め込みプロセッサに
おけるImpulse Cソフトウェア処理の実行をサポート
する
• Impulse Cプラットホームサポートライブラリは、
• Xilinx MicroBlazeやパワーPCベースのFPGAsなどの
特定のFPGAベースのターゲットに利用可能
• ハードウェアがソフトウェア処理に連結しないモ
ジュールを生成するのに使用できる
→Impulse Cを利用するために埋め込み
プロセッサを必ずしも含む必要はない
4.2
• Inpulse Cは、通信プロセスの並行なプログラミングモデルを
支持してCコンパチブル事前に定義されたライブラリ関数を使
用することで、標準のANSI C(アメリカ国内の工業製品の規
格を策定する団体の定めたC言語の規格)を拡張している。
• Impulse Cでは、プログラミングモデルは永続的なCサブルー
チンとして実装される独自に連動しているプロセスのコミュニ
ケーションのプライマリメソッドとしてバッファリングされた
データ・ストリームの使用を強調する。
• ※サブルーチン プログラミングにおいて、コード中で何度も
必要とされる定型的な処理を一つのプログラムに
まとめて外部から呼び出せるようにしたもの。
• 構成されるFlFOsを使用するデータのこのバッファリング
で、より高いレベルの抽象化で並列アプリケーションを
書くことが可能になる。
• Impulse Cは事前に定義されたCコンパチブルというライ
ブラリ関数を使っているスタンダードANSI Cを拡張した。
• そのライブラリ関数は、通信プロセスの並列なプログラミ
ングモデルを支持している。
• Impulse Cはストリーム指向のアプリケーションのために
設計されているが、代替のプログラミングモデルをサ
ポートするほど柔軟性があり、並行で、独自に連動して
いるプロセスの間の伝達方法としてシグナルと共有メモ
リの使用を含んでいる。
• Impluse Cアプリケーションはデスクトップシミュレーショ
ンのために標準C開発ツールでコンパイルできる。
あるいはFPGAターゲットのためにImpluse Cコンパイラ
でコンパイルできる。
• Impulse Cコンパイラは、Impulse Cプログラムを適切な
低レベル表現に翻訳して、最適化する。
そしてそれはFPGAへと統合できるVHDLハードウェア
記述と、広く利用可能なCクロスコンパイラの使用で
支持されたマイクロプロセッサにコンパイルできる
スタンダードCを含んでいる。
• 完全なImpulse C環境はImpulse Cアプリケーションが
標準のデスクトップコンパイラで編集されて、作成され
るのを許容するライブラリのセットからなる。
4.3 HelloFPGAとは
どういったプログラム?
FPGAハートウェアソフトプロセスと
ソフトウェアテストベンチの関係
4.3 Impulse Cのプログラミング例①
HelloFPGA _sw.c①
伝統的なプロセッサの上で動くソフトウェアを表す
アプリケーションの一部
→伝統的はプロセッサとは?
• 目標システムの一部である埋め込み型プロセッサ
• デスクトップシミュレーションの間、ソフトウェアテスト
ベンチ(試作品)として使用されるプロセッサ
HelloFPGA _sw.c②
コメントヘッダ
このプログラムにおける簡潔な説明
#include…
co.hファイルはImpulse C関数ライブラリーを表す宣言と
マクロを含んでいる
extern co_architecture…
関数co_initialize(初期設定)の宣言
main関数で参照されるかもしれないので、アプリケーション
のコンフィギレーション(構成)関数と同じファイルに
入っていなければならない特殊関数。
HelloFPGA _sw.c③
void Producer
ソフトウェアソフトベンチのインプット側を表す
いくつかの試験データ(この場合、“Hello FPGA!”という
文字を詳細に説明するキャラクタの簡単なストリーム)
を生成
プロセス自体は、いくつかの宣言と、入力文字列を通して
繰り返しそして出力文字列として宣言されたストリームへと
文字を書きだす内部コードの繰り返し
co_stream_open,co_stream_write,co_stream_close
ImpulseCはこのようなプロセス走行関数定義を、
ハードウェアやソフトウェアの中で実際の実現や
具体化から引き離す。
HelloFPGA _sw.c④
void Consumer
ソフトウェアテストベンチのアウトプット側を表す。
Producerプロセスのように、このプロセスはデータ
ストリーム経由でアプリケーション(特にテストされる
ハードウェアモジュール)の他の部分と相互に作用する。
また、キャラクタがモジュールでテストで生成されている
限り、このプロセスはinpute_streamからキャラクタを
読み込ませる内部コードのループをする。
HelloFPGA _sw.c⑤
main
メイン関数。主な機能は単にコンソールに
メッセージを表示することと、Impulse C関数である
co_initializeとco_executeを呼び出すことで
アプリケーションを実行する
co_initialize
あらゆるImpulse Cアプリケーションの必要な部分
(詳細は後に述べる)
co_execute
アプリケーションと、自身の構成するプロセスを実行する
Impulse Cライブラリの関数
Impulse Cのプログラミング例②
HelloFPGA_hw.c①
HelloFPGA_hw.cはFPGA上で動くハードウェアを表すアプリケー
ションの一部が書かれている。
#Include…
co.hファイルを読み込んでいる
Extern宣言
HelloFPGA_sw.cで定義されたProducerとConsumer
プロセスのための宣言。コンフィギュレーション関数は
これらが処理する参照が必要なので、ここで必要となる。
HelloFPGA_hw.c②
void DoHello
プロセス走行関数。このプロセス走行関数は二つのストリーム
オブジェクトを受け入れる。その片方である入力ストリームは、
8ビットの文字値の入ってくるストリームを表す。
このストリームはProducerプロセスの出力に関連づけられる。
もう片方の出力ストリームは処理データを表している。
そのデータもまた8ビットの文字値である。
このストリームはConsumerプロセスに関する入力ストリームに
関連づけられる。Consumerプロセスのように、データが入力に
現れる限り、このプロセスは入力ストリームを作動させる内部
コードをループする。
このストリーム操作はImpulse C関数である以下の
co_stream_open, co_stream_read,co_stream_write,
co_stream_closeを用いて説明される。
HelloFPGA_hw.c③
このco_process_create関数コールはこのプロセスの
インスタンスを一つ作成し、そのプロセスインスタンスの
名前を示す。このプロセスは実際に受信データで
何もしない。代わりに、入力ストリームに現れる各値は
すぐに、co_stream_writeを通して出力ストリームに
書かれる。
void config_subroutine
コンフィギュレーションサブルーチンは,アプリケーションの
構造をプロセスがどう相互接続されていることになっているか
使われたプロセスの観点から定義する。このコンフィギュ
レーションサブルーチンは、3つのプロセスインスタンスを
作成するためにco_process_create関数を使う。そのイン
スタンスは producer, consumer, helloという名が与えられる。
HelloFPGA_hw.c④
データをproducerからhelloへ、またhelloからconsmerへ
それぞれ2つのストリームを作成するために
co_stream_create関数を使った。最後に、明確に述べる
ためにプロセスコンフィギュレーション関数の
co_process_configを使った。
3つのプロセスのうちの一つ、helloは目標FPGAを表す
PEOと呼ばれるハードウェアリソースに割り当てられる
ことになっている。
HelloFPGA_hw.c⑤
co_archtecture co_initialize…
コンフィギュレーションサブルーチンのように、
co_initialize関数はあらゆるImpulse Cアプリケーションで
必要とされる。この関数の中ではco_architecture_create
関数への唯一の呼び出しです。その関数は前もって
アプリケーションの目標アーキテクチャへ(この場合では
ジェネリックハードウェア・ソフトウェアプラットフォーム)の
コンフィギュレーション関数を関連付けます。(特定の
プログラム可能な編集の目標になるプラットフォームは
ハードウェアコンパイラ設定の一部としてアプリケーション
ソースファイルの外で定義される。)