第3章 FPGA ベースのアプリケーションの プログラミングモデル 理工学研究科 情報科学専攻 6311615 尾内 克郎 はじめに この章では どのようにして独立した機能要素を表現し、相互接続するか システムをどのように同期するか についてプログラミングモデルの観点から議論する。 適切なプログラミングモデルを選択することは、 抽象的、効率的にプログラムしアプリケーションを 作成する上で重要である。 3.1 並列処理モデル 今日の一般的なプロセッサアーキテクチャは、 1940年代に John von Neumann が示した マシンモデル(ノイマン型)を基にしている。 古典的なノイマンコンピュータは、CPUと記憶装置 (命令とデータを記憶する)の接続で構成される。 CPUは以下の操作を実行する。 読み取りおよび書きこみ操作を含む操作。 命令のシーケンスとして格納されたプログラム。 SISD マシンモデル 単一の命令(Single Instruction)に対し単一のデータ (Single Data)の操作を行うアーキテクチャ 単一命令とは ADD のようなコンピュータ命令を指す 開発されているプログラミング言語の大半や、 それにより作成されるアプリケーションは このマシンモデルを基本としていると言える。 並列処理をプログラムする段階においても、 パイプラインやその他のアーキテクチャの拡張に よって貫いている。 SISD マシンモデル 初期のプロセッサアーキテクチャの開発においては 並列処理はパフォーマンス向上のために導入された。 プリフェッチ(事前読み込み)による実行との並列化など この処理は後に命令パイプラインへと発展した。 最近ではベクタプロセッサ(ベクトル計算機)がある。 データそのものをパイプラインで処理する。 例)10組の加算を行う場合、加算する側とされる側の10個を それぞれまとめて読み出し、一気に加算する。 ※通常はアドレスをずらしながら加算を10回繰り返すため、 命令の読み出し回数に差が生まれる。 SIMD マシンモデル 単一命令(Single Instruction)で、複数のデータ (Multiple Data)に対する処理を同時に行うモデル。 制御プロセッサが多くの処理要素の動作を指示して 並列処理をサポートする。 大量のデータに似たような処理を施す際に性能を発 揮するため、マルチメディア処理に向いている。 商用スーパーコンピュータにはこのモデルを使用し て いるものもある。 提供元 Thinking Machines, Cray, Equipment Corporation Digital MIMD マシンと Transputer 並列処理をさらに1段階上げたものが MIMD(Multiple Instruction, Multiple Data) である。 MIMDは独立した複数のプロセッサが並列に動作し、 異なるプロセッサは異なる命令を処理する。 並列処理の研究の多くを生み出したプロジェクトが 1980年代に INMOS が設計したマイクロプロセッサ Transputer である。 トランジスタ+コンピュータの造語 Transputer 単一のコンピュータとして動作する Transputer を複 数接続するモジュール化されたシステム。 それぞれ空き時間に別の仕事をさせることもできる。 Transputer 同士をシリアルリンクで接続することで 1 つのコンピュータを構成する。 ボトルネックはデータ移動のための通信にある。 低コストで比較的高い性能を実証した。 高い処理能力を活かすため、Occam と呼ばれる 独 自のプログラミング言語を使用する。 共有メモリMIMDアーキテクチャ Transputer はメッセージパッシング方式であり、 ロセスごとにデータの直接受渡しをしていない。 プ 独立性が高くリソースをあまり必要としない。 直接の受け渡しにはメモリ等の、共有のリソースが 存在することが前提となる。 共有のリソース使用により、プロセッサ間の高速な 通信が可能となるため、メモリやプロセッサ群を バスで接続し、さらにそれを階層化することもある。 これらはメッセージパッシングと組み合わせ、 あるいは代替案として使用される。 3.2 並列計算機としてのFPGA FPGAを並列計算に用いることで高速化されることに 議 論の余地は無い。 特定の種類の計算では1000倍以上の高速化も。 FPGAの計算構造は自由に作れるため。 アルゴリズム実装のためにストラクチャを作ることで、 さまざまな制御機能を作ることが可能である。 アプリケーション開発の2つのアプローチ 低レベル(ハードウェア寄り) コンパイラツールによって命令レベルでの並列処理のハードウェアを 抽出・生成する。 高レベル(アプリケーション寄り) 並列で動作するブロックの集合としてアプリケーションをモデル化する ことで並列処理を表現する。 3.2 並列計算機としてのFPGA FPGA の使用を成功させるカギ 並列でないアプリケーションから並列性を抽出する ツールは開発されてきたが、効率的ではなかった。 並列計算に適したプログラミングを行う。 実用的で自動化されたコンパイラツールを適用する。 コンパイラはアプリケーションに対する知識を持っていない ため、並列構造の活用や最適化をできない。 最大パフォーマンスを得るには、ハードウェア開発者 の介入によってアプリケーションの書き換えを行う 必要があると考えられる。 ただし、これはアプリケーションの大規模な再設計ではない。 3.2 並列計算機としてのFPGA システムレベルで並列処理アプリケーションを分割する アプローチは、プログラム実行のための概念モデルの 必要性を示している。 このモデルでは機能的に独立したプログラムでは、 ハードウェアブロックにコンパイルされている。 これによりCPUを介さず計算でき、並列実行も可能となる。 プログラムブロックが並列構造で構成されたマシンモデルでは、 並列と手続き型の両方のプログラミングモデルを必要とする。 ※この本で使われるC言語ライブラリはこのようなモデルを C言語の感覚を維持しながらサポートしている。 3.2 並列計算機としてのFPGA プログラミングモデルは基礎になるマシンモデルを 正確に反映する必要は無い。 抽象化したほうが、信頼性を増した状態でプログラムを コンパイラに渡すことができ、容易にマシンがプログラム される。 欠点としてプログラム効率がコンパイラに依存する。 以降で説明するプログラミングモデルでは、高レベル (システムレベル)の並列性の制御を提示しつつ、 低レベル(命令レベル)の並列処理の詳細を抽象化する という中間レベルをとっていく。 コラム:なぜCを使うのか? 組み込みシステムやアプリケーション開発者の多くが 精通している言語である。 C言語で組まれたアルゴリズムやアプリケーションを 利用することができる。 並列処理プログラミングは難しい為、扱い慣れた言語で 行うのがよい。 従来のアルゴリズムを並列モデルに翻訳するのは 実用的ではない場合がある。 並列同等のアルゴリズムと順次適用のアルゴリズムを 組み合わせることは可能。 説明するのにわかりやすい例が出せるから。 ベクタプロセッサの処理例 Wikipedia の例より ・通常のプログラミング execute this loop 10 times(ここから10回ループ) read the next instruction and decode it(次の命令を読み出し、解読) fetch this number(こちらの数字を取り出す) fetch that number(あちらの数字を取り出す) add them(加算) put the result here(ここに結果を) end loop(ループ終わり) ・ベクタプロセッサでのプログラミング read instruction and decode it(命令を読み出し、解読) fetch these 10 numbers(こちらの数字を10個丸ごと取り出す) fetch those 10 numbers(あちらの数字を10個丸ごと取り出す) add them(一気に加算) put the results here(まとめて結果を保存) Occam Communicating Sequential Processes(CSP)に基づい た手続き型並列プログラミング言語 仕様としてスレッド的なタスクを持っており、 Occamで書いたプログラムは自然にマルチスレッド になる。 入出にシリアルポートを用い、Transputer はこれを動 作させるために作られたともいえる。
© Copyright 2024 ExpyDoc