1 計算機アーキテクチャ特論 東京理科大学 理工学研究科 情報科学専攻 修士1年 6311618 大野 葉月 2 Chapter4.4 プロセス、ストリーム、信号、メモリ 3 Chapter4.4 その1 • Impulse Cプログラムモデルの中心 = プロセス、ストリーム • 前の章において、HelloFPGAで両方の例を見た • プロセスについて • アプリケーションのセグメントの操作により、独自に動く • C言語で記述されている • 仕事 = データの受け入れ → 計算の実行 →出力の生成 • ストリームについて • プロセス間で同期をとる、一方向チャネルのこと • co_stream_createでストリームの特性が指定できる • データはストリームか論理回路の上を流れる 4 Chapter4.4 その2 • プロセスは実行関数(ユーザがC言語で定義)で定義される (HelloFPGAの例では) • プロセス ソフトウェアプロセス ハードウェアプロセス (分類方法:構成サブルーチンで指定) • ソフトウェアプロセスは通常、動きが抑制 • ハードウェアプロセスは、プロセッサが限界になると抑制 5 Chapter4.4 その3 • Impulse C ハードウェアのコンパイラの規制を満たすために、 C言語でプロセスを書かなくてはならない • C言語、事前定義関数がソフトウェアプロセス、ハードウェアプロセスで 参照される • 事前定義関数:ストリームやシグナル操作で動く関数 • Impulse C のコンパイラ • 統合コンパチブルハードウェア記述を生成 • スケジューリング、パイプライン処理、ストリーム操作などが可能 • ハードウェア記述は目標ハードウェアとの並行関係を利用 (コンパチブル = 互換性がある) 6 Chapter4.5 符号のあるImpulse Cと符号なしのデータ型式 7 Chapter4.5 その1 • 提供されているデータ型式 - 1から64bitまでで長さを指定 符号あり、なしを指定 例: co_int1-1ビットの整数型 co_int7 -7ビットの符号あり整数型 co_uint16 -16ビットの符号なし型 co_uint24 -24ビットの符号なし型 co_int32-32ビットの符号あり型 co_uint64-64の符号なし型 8 Chapter4.5 その2 • デスクトップ模擬環境とハードウェア実装では、ビット単位の 振る舞いに差がある ⇒数学的マクロ動作を使用して正確にモデリング可能 例: UADD4(a,b)-符号なし4ビットの足し算 ISUB7(a,b)-符号あり 7ビット引き算 UMUL24(a,b)-符号なし 24ビット掛け算 UDIV28(a,b)-符号なし28ビット割り算 9 Chapter4.6 プロセスの理解 10 Chapter4.6 その1 • プロセス – Impulse Cでの基本的なユニット計算 ユニットのコードを実行するのが仕事 自身を制御できる 独自に同期がとれる メモリリソースにアクセスができる プロセスでプログラムを作る ≒ スレッドでプログラムを作る ∴C言語をImpulse C に変換することは簡単 ・・・とはいえ、違いはある 11 Chapter4.6 その2 スレッドプログラミング • グローバルとヒープのメモリ Impulse C • グローバルはサポートされない が共有 • スレッドは同じプロセッサ上で • プロセスごとのプロセッサか 実行 論理ブロックに割り当てられる • 共有データ構造とセマフォアを • 複雑なハードウェアとソフトウェア 使って交信する のサポートをするように設計 • プロセスが定義、作成されるのは • プロセスが定義、作成されるの 作成、呼び出し、破棄する時 は、初期化、ロードの時 12 Chapter4.6 その3 • Impulse C のデスクトップシュミレーション • ライブラリはスレッドに基づく ⇒グローバルとヒープのメモリは共有される • プロセスが実行されるが、これはターゲットプラットホーム上でない 可能性がある • ライブラリの外に割り当てられたグローバルとヒープのメモリの使用は 避けるべき 13 Chapter 4.6 その4 • 注意 • デスクトップシュミレーションにおいて、スケジューリングの予測は、 プロセス中でのみ可能 ⇒プロセスの外はスレッドモデルに頼っている • プロセスが始まる前に、すでに別のプロセスが始まり、実行している だろう、と仮定してはいけない ⇒このような同期が必要ならば、 同期信号 か ストリームのアプリケーションの使用 を考えるべき 14 C言語における、timed、untimedの意味は? (timed、untimed = 時間制約がある、ない) 15 Chapter 4.6 その5 • timed、untimedとは C言語の系列の中にクロック境界の場所を指定するか否か 16 Chapter 4.6 その6 • クロック境界 =各基準クロックの各信号値を出力する サイクル期間ごとの境界を示す • timedについて • クロックの境界が定義されている • 定義上でのC、ソースファイルが異なったクロック周期を表す • プログラマによる制御がかなり可能 ⇒ プログラマの仕事が多い • 手動で情報を入力 • 自分で管理が必要 • 独自の記述が可能で、untimedとは違う機能を持つことができる 17 Chapter 4.6 その7 • untimedについて • Impulse C はuntimedメソッドを使う • プロセスの中の状態は指示ステージの総数を最小にするという目標の ため • オプティマイザに影響を与え、 サイズ/速度 要件に合わせられる • 特定のクロックイベントへのC言語で関連づける方法、 低レベルであるハードウェア概念(クロックとして可能であること)を 知らせない (直接、定義された時は除く) 18 Chapter 4.6 その8 • untimedの利点 • よりソフトウェアプログラミング経験を生かせる • アプリケーションは、より高いレベルで表現して、よりハードウェア中心の コンパイラとC言語レベルで最適化できる • untimedの欠点 • 正確にハードウェアを制御できないかもしれない ⇒アプリケーションを部分的には低レベルHDLプログラムに落とす 必要があるかもしれない 19 作成プロセス 20 Chapter 4.6 その9 #define BUFSIZE 4 void my_app_configuration() { co_process procHost1, procPe1, procPe2; co_stream s1, s2; s1 = co_stream_create("s1a, INT_TYPE(16), BUFSIZE); s2 = co_stream_create("s2", INT_TYPE(16), BUFSIZE); procHost1 = co_process _ create("Host1", (co_function)Host1, 1, s1 ); procPe1 = co_process_create("Pe1'', (co_function)Pe1, 2, s1, s2); procPe2 = co_process_create("Pe2", (co_function)Pe2, 1, s2); } 21 Chapter 4.6 その10 • プロセスはアプリケーションの構成機能で作成、命名される • my_app_configuration = プロセスと対応する機能が、 関連づけられていることを宣言 • co_process_create = ハードウェアとソフトウェア処理の両 方を定義 引数 プロセス名を含む文字列へのポインタ co_functionタイプの機能ポインタ プロセスで定義されるポート(入出力する)の数 22 Chapter 4.6 その11 • co_process_create機能について • ポートの数や命令を間違えるとデバッグが難しくなるので注意 • 実行プロセスに指定されたポートの引数は、 以下の中からでも可能 • co_stream - データがFIFOバッファインタフェースを通して移される • • • • ストリーミングの二地点間インタフェース co_signal- メッセージが送付プロセスによって掲示されて、受信プロセス によって待たれるかもしれない、バッファリングされた 二地点間インタ フェース co_memory - インタフェースサポートブロックが読み書きする共有メモリ co_register - 低レベルで、非バッファリングされたハードウェアインタフェース co_parameter - コンパイル時のパラメタ (宣言、インスタンス作成(co_xxxxx_create機能)をしなければならない) 23 Chapter4.7 ストリームの理解 24 Chapter4.7 その1 • ストリーム = プロセスを接続する単方向の通信チャネル • co_stream_create = ストリームの作成 • strm_image_value = co_stream_create("IMG_ VAL", INT _ TYPE(16),BUFSIZE); 引数 任意の名前・・・・・・・・・・・・・・・・・・・・① データ要素のタイプとサイズ・・・・・・② バッファサイズ・・・・・・・・・・・・・・・・・③ 25 Chapter4.7 その2 • 引数について • ① : デバッグ、外部からのモニタリング、および後プロセスの目的 のためにストリームに割り当てられるかもしれない任意の名前 この名前に意味も持たない ダウンストリームの統合かシミュレーションツールの役に立つかも しれない • ② : INT TYPE、UINT TYPE、およびCHAR_TYPEを含む特定の ストリーム型を定義するのにマクロを提供 • ③ : 2つのプロセスの間で作成されるFIFOバッファのサイズに関連 26 Chapter4.7 その3 • バッファサイズ • 1の場合 : ストリームが本質的には非バッファリングされることを示す ⇒ 受信プロセスは送信プロセスがデータをストリームに 移動させるまで妨げる • 大きめの場合 : 生成される追加ハードウェアリソースや、 効率的なプロセス同期をもたらす • 用途に応じて、バッファサイズを選ぼう • なるべく、小さいストリームバッファサイズを選ぶべき 27 Chapter4.7 その4 #define BUFSIZE 4 void my_config_function(void *arg) { co_stream host2controller,controller2pe,pe2host; co process host1 , host2; co_process controller; co_process pe; host2cntrlr=co_stream_create("host2cntrlr", INT_TYPE(32), BUFSIZE); cntrlr2pe=co_stream_create("cntrlr2pe", INT _ TYPE(32), BUFSIZE); pe2host=co_stream_create(''pe2host", INT_TYPE(32),BUFSIZE); host2=co_process_create("host2'., (co_function)host2_run, 1, pe2host); pe=co_process_create(''pe", (co_function)pe1_proc_run, 2, cntrlr2pe, pe2host); cntrlr=co_process_create("cntrlr", (co_function) cntrlr_run, 2, host2cntrlr, cntrlr2pe); host1 =co_process_create("host1", (co_function )host1_run, 2, host2cntrlr, iterations); co_process_config(cntrlr, co_loc, "PEO"); co_process_config(pe, co_loc, "PEO"); } 28 ストリームはハードウェアで どのように実装されますか? 29 Chapter4.7 その5 • co_stream pixelvalues; pixelvalues = co_stream_creat(“pixval”,UINT_TYPE(24),2); 2の深さのバッファで、幅24ビットのデータ値の、pixvalという名前の ストリームを生成 • 稼働しているハードウェアの実際の深さは2でなければならない ⇒コンパイラは2に近い、切り上げられた値になる • バッファ幅(第2引数)はデータの本質を反映 • ストリームとその対応する(第3引数)の深さの決定は複雑 30 Chapter4.7 その6 • 大きいバッファを使用すると・・・ ⇒稼働しているハードウェアのサイズ上で重要な影響を 与えうる =メモリを浪費 (OS から過度のメモリが取られて 、ページングが発生する場合も) • 小さ過ぎるバッファを使用すると・・・ ⇒何らかの計算を実行する前にデータの複数のパケッ トを読まなければならないプロセス、 異なったレートで作動する接続プロセスのせいで、 デッドロック状態になりうる 31 入出力ストリーム 32 Chapter4.7 その7 • プロセスの読み書き は プロセス実行関数 で実行 • プロセス実行関数(Impulse C では) • 繰り返し1つ以上のストリームを読み込む → データが利用? Yes → 処理と実行 No → 利用可能になるまでブロック • 非データフロープロセスモデルをサポート(後で説明) 33 Chapter4.7 その8 • co_stream_open = ストリーム内部のリセットを行い、 読み書きのどちらも利用可能にする 例 : err= co_stream_open(input_stream, O_RDONLY, INT_TYPE(32)); 引数 ストリーム ストリームのタイプ データ型 • co_stream_openで開くストリームがすでに開いていた場合 ⇒エラーコード、co_err_already_openを返す 34 Chapter4.7 その9 • co_stream_close = ストリームを閉じる ストリームの終わり(EOS)のトークンを 出力ストリームに書く 例 : err= co_stream_close(input_stream); • co_stream_read = ストリームを読む(EOSの検出を行う) EOSトークンを受け取ったとき、エラーを返す • 閉じているストリームであれば開かず(または、既に閉じられた)、 co_stream_closeの機能がエラーコード、co_err_not_openを返す • co_stream_closeを呼ぶとき、アップストリームプロセスがストリームを 閉じたことを示すために、EOSトークンを受け取るまで、読み込みプロセス をブロック 35 Chapter 4.7 その10 • いったん閉じられると、プロセスは複数のセッションのために 再びストリームを開くことができる • 読みこみと書き込みプロセスで適切にすべてのストリームを 終えなければならない • 注意: • プロセス間でのストリーム接続は1対1でなければならない • 複数対1接続もサポートされない • 中間ストリームコレクターや配分プロセスを作ることで、 アプリケーション 中の、データ配分パターンを作ることができる 36 Chapter4.8 出力ストリームの使用 37 Chapter 4.8 その1 • co_stream_write = 出力ストリームの書き込み co_stream_open(output_stream, O_WRONLY, INT _ TYPE(32)); for (i=0; i < ARRAYSIZE; i++) { co_stream_write( output_ stream, &data[i], sizeof(int32) ); } co_stream_close( output_stream); 38 Chapter 4.8 その2 • co_stream_writeの機能 指定された出力ストリームが完全であるかどうか確認 → 完全であるなら、書きこみをするために、 ストリームバッファができるまでブロックする • ストリームが開かれて、プロデューサーとコンシューマーで プロセスを使用していると、ストリームを管理する必要がない 適切に設計されないなら、デッドロック状態のリスクがあり 39 Chapter4.4~4.8のまとめ • Impulse Cプログラムモデルの中心 = プロセス、ストリーム • 符号の有無を指定できるデータ型式を提供 • 数学的マクロ動作を使用してのモデリングが可能 • C言語をImpulse C に変換することは簡単 • co_process_create = プロセスの作成 • co_stream_create = ストリームの作成 • 用途に応じつつ、小さいストリームバッファサイズを選ぶべき • co_stream_open、read、close = ストリームの読込みと開閉 • co_stream_write = 出力ストリームの書き込み 40 ご清聴ありがとうございました
© Copyright 2024 ExpyDoc