太原研究室 M1 割田臣一
既に述べたように、イメージフィルタは一般に、 動作しているイメージデータの画面に作用する。 ◦ この例では、 3×3 ウィンドウ上でフィルタを作用させる。 ◦ 処理においては 3 つの新しい値と、先程のピクセルの計 算で用いた 6 つの同じ値を使う。 カラム( column ):縦方向の列、数学で列 ⇔ row(横方向の列、数学で行)
カラム生成プログラムは左から右に処理を進め、 どんなサイクルにおいても 3 ピクセルの行のスト リームを発生させる。 このストリームは、 3 つの新しい値に対応する 1 つ の 3 ピクセル列に相当する。 3 つの新しい値は、フィルタによって次の処理対 象となるピクセルのフィルタ画面において必要と される。
Prep_run プロセスは、オリジナルのアルゴリズム 同様 3 ピクセルの列データを生み出すのに十分な データ量をバッファリングするが、より簡単な方 法でバッファリングを行う。 オリジナルのアルゴリズムの性能にてネックとな るのが、 1 つのバッファからピクセルの値を取得 する方法であった。 バッファは全てのピクセルを含んでおり、「前を 見る」「後ろを見る」ためにある画像の行全体を 必要とした。
イメージフィルタの性能を向上させるためには、 同じメモリへのアクセス回数を減少させたい。 そのために、要求された計算を実行する際の繰り 返し回数を減らしたい。 ⇒7 、 10 章で述べた配列を分割する技法を用いるこ とで一度のループで同じ配列にアクセスする必要 性を失くす。 その結果、 2 クロックに 1 回ピクセルの列を生み出 すことで非常に高いスループットを実現できる。 → 図 参照
この過程は ◦ 1 つのピクセルのストリームを受け入れる ◦ 配列 B,C に 2 つのスキャンラインをキャッシュする ◦ オリジナルの例と似た循環バッファ技術を用いることで 3 つの出力ストリームを生成する。 ※ スキャンライン:ディスプレイの走査線、画像の横 1 列 ⇒ 同じ配列への不要なアクセスを避けることで、そ れぞれの列の出力の待ち時間を 2 クロックにでき る。
このパイプラインで最も大切な過程はフィルタ自 身。 これは図 における filtter_run で表さ れる。 この過程は prep_run プロセスによって生成された 3 つのピクセルのストリームを受け入れ、オリジ ナルのアルゴリズムと同様の畳み込みを行う。 この畳み込みにおいて、多数のステートメントレ ベルの最適化は入力処理の繰り返し回数を減らす ことに繋がる。
オリジナルの手法で行われたように、隣接するピクセ ルは配列から呼び出されること無く、ローカル変数 p01,p02,p03 等に格納される。 ◦ これにより、 1 つの配列に同時にアクセスをする必要がなくな る。 ◦ 1 つの配列に同時にアクセスをしてしまうと、オプティマイザ が単一のステージにて複数の計算を同時に行うことが妨げら れる。 水平、垂直、斜め方向における座標の違いの計算は、 より単純で並列化が可能な計算に置き換えられる。 ◦ これにより、 abs( 絶対値 ) 機能やマクロの必要性をなくせる。 ◦ この場合、中心のピクセルは繰り返し周辺のピクセルと比 較され、平均差が得られる。
これらの変化によって、僅か 2 クロックのスルー プット率のエッジ検出アルゴリズムが実現される。 もちろん、この計算は他のタイプの畳み込みを行 う様に必要に応じて修正できる。
from_stream は、先の図 11-9 述べられた to_stream 処 理と反対の機能を提供する。 この処理では、入力ピクセルの単一ストリームを読み 込み、それに続いて列を読み込み、 co_memory_writeblock によって出力メモリに書き込 まれる。 またこの処理では、ストリームから読み込まれ、メモ リに置かれたバイトの並びを入れ替えることで、使用 される画像形式を反映する。(この場合は TIFF 形式) このストリームからメモリまでの処理,from_stream を 図 で示す。
11.4で述べたこれら 4 つのプロセス、対応す るストリーム、メモリ、および信号宣言は、 Impulse C によって記述され、図 に示され る構成機能によって相互接続される。 この構成機能は、以下に示すような機能を持って いる。
startsig と donesig のための信号宣言。 ◦ Startsig がイメージバッファが処理の準備ができている ことを示すのに対し、 Donesig はイメージのフィルタリ ングが完了したことを示す。 ◦ これらの信号は、ソフトウェアテストベンチとイメージ フィルタハードウェアの間の共有メモリ ( イメージバッ ファ ) の使用を調整するのに使われる。 ピクセルストリームの入出力と prep_run から filter_run に接続する 3 つのストリームのためのス トリーム宣言 Shrmem のためのメモリ宣言。 ◦ このメモリはイメージバッファを表す。
4 つの必須ハードウェアプロセスと 1 つの追加ソフトウェア のテストベンチ処理、 cpu_proc のためのプロセス宣言。 ◦ このソフトウェアのテストベンチ処理は Appendix E に 記載されている。 2 つの信号 startsig と donesig のための co_signal_create の 呼び出し。 メモリ shrmem のための co_memory_create の呼び出し。 ◦ メモリは、この例で扱う Altera プラットホームに対応した位置 heapO に作成される。 ◦ heap0 は専用ハードウェアとして FPGA 上で作用しているプロ セッサとイメージフィルタにアクセスできるオンチップメモリを 表す。 プロセッサには、ソフトウェアのテストベンチが置かれる
入力ストリーム、出力ストリーム、 3 つの中間的ストリームから 成る 5 つのストリームのための co_stream_create の呼び出し。 ◦ 3 つの中間ストリームが深さ 4 のストリームを与えられているの対して、 入力および出力ストリームの深さは、画像のスキャンラインの半分の数 である。 ◦ この処理は、メモリ読み書き時間が予想以上に長くなることによるス トールを軽減するために行われる。 ◦ しかし、この様に深いストリームバッファはハードウェア資源において 相当な負担となることに気をつける。 4 つのハードウェアプロセスと 1 つのソフトウェアテストベンチ プロセスのための Co_process_create の呼び出し。 4 つのハードウェアプロセスのための co_process_config の呼び 出し。 ◦ これらの 4 つのプロセスが、ハードウェアブロックとして FPGA にコンパ イルされる。