第4章 Impulse C の導入
description
Transcript of 第4章 Impulse C の導入
第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⑤
m ain メイン関数。主な機能は単にコンソールに メッセージを表示することと、 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 関数への唯一の呼び出しです。その関数は前もって アプリケーションの目標アーキテクチャへ(この場合では ジェネリックハードウェア・ソフトウェアプラットフォーム)の コンフィギュレーション関数を関連付けます。(特定の プログラム可能な編集の目標になるプラットフォームは ハードウェアコンパイラ設定の一部としてアプリケーション ソースファイルの外で定義される。)