第7章 ステートメントレベルでの並列化 明石研究室 6311617 大木 和田留 概要 • C言語は逐次的であるCPUに合わせて逐次 的な命令を記述するように設計された言語で あり、この章ではC言語による逐次的プログ ラミングと並列化、高速化されたハードウェア 間の相違について記述している。 7.1 FPGAを用いた計算 • 従来のCPUと同様に制御回路、算術演算装置、 クロック制御は存在する • 但し、FPGAにおいての計算は加算器、減算器、 乗算器のように予めその用途ごとの演算装置と して設計されたものによって処理される • CPUと同じくしてこれらの複数インスタンスが並 列処理を可能にしているのだがFPGAでは利用 可能なハードウェアと接続している装置の数に 依存して並列化の限界が決まる • CPUとFPGAは共にクロックにより演算処理の 速度を制御している • 演算装置ごとに固有のサイクル内で1つのタスク を処理するので、結果として最大クロック数は演 算装置のパフォーマンスに依存している • CPUでは1クロックでいくつかの算術演算をこな しているのに対し、FPGAでは複数のクロックで 異なる算術演算を各々異なる比率で処理してい る • FPGAも結局はCPUのようにどのデータがどの 演算装置に送られ出力結果がどこへ送られるの かを示すために処理精度を保つコントローラの 導入が不可欠である • CPUと異なることとしてコントローラは実行され ているアルゴリズム固有のものを使用できる • 生成されるハードウェアの構造がCPUと酷似し ているのならば計算の高速化は何に起因してい るのか? • 近代のCPUに特有の多くの欠点は計算のモデ ル生成をすることにより回避できる • 第一に従来のCPUはデータをデコードしたり 様々なものを実行しているため制御と計算を同 時に実行できない • それに対し計算に特化したFPGAの場合、これ らの処理は演算装置と並列に処理が可能なコン トローラによって並列的に実行することができる (最近の高性能CPUはパイプライン化、プレ フェッチにより並列処理に優れているが) • 第二にソフトウェアのプロセスを直にハードウェアにコンパ イルすることで演算装置を必要な限りいくらでも生成する ことが可能であると言われている(これに対し一般用途の CPUは固定の装置しか持たない) • 第三に生成されたハードウェアは元のアルゴリズムにおい ての複数の異なるステートメントと最適化された命令パイ プラインにより形成された1サイクルでの処理をする • 最後にCPUは一般的にFPGA実行に伴い生成された ハードウェアは相互、またはI/O処理に対し並列的に実行 され複数のメモリ処理を支えるRAMのブロックや外部資 源を利用できる(CPUは一般的にメモリ資源のみを利用 する) 7.2 C言語と並列化 • プログラミング言語の意味を理解することにより プログラマーのデバッグの効率があがる • いかなる最適化を目的とするときもアルゴリズム を可能な限りシンプルに設計し、目標の実行速 度が達成できるまでコードを改良することが最善 である • この章ではハードウェア上でどの程度処理が行 われているのか、シングルプロセス内での並列 化を説明し、続く3章では実際に高速化の具体 例を紹介する • 次章ではシステムレベルでの並列化の例 7.3 命令レベルでの並列化 • Impulse C toolsはCとRTLオプティマイザーから 成る(一般的なFPGAで特に使われるStage Masterと同様の一般C言語を最適化する) • Impulse Cにより実行速度と回路構成の大きさ を最善のものにするためにこれらのオプティ マイザーによりどのようにCのコードが並列化 されるかについての最低限の知識が必要で ある • プロセスやループ文における個々のブロック 単位での最適化は可能である • 各々のブロックに対し命令のパイプライン化、 データが衝突しない命令をスケジュールする ことでオプティマイザーは命令ステージ数を 最小限に抑える • 逐次的なアルゴリズム文から最適化された ハードウェア同様のパフォーマンスを得るた めには並列化は欠かせない パイプライン生成 • PIPELINE pragmaを用いてパイプライン化が可 能な特定のステージを並列化する • パイプライン化ができなければそのステージ は逐次的に生成され、ステージ内の全ての文 は1クロック内で逐次的に実行されることとな る Cのコードにおける命令レベルでの3つの 並列化方法 1. 複合文の副演算は並列化できる、例えばx=(a+b)*(c+d) は従来のプロセスでは乗算が実行される前に加算を実 行し、異なる2つの命令サイクルを必要としていたが2つ の加算の合計は並列的に同じサイクルで実行できる 2. 相関がない下記のような命令は並列化できる x=a+b; x=a+c; これらのような2文、あるいはそれ以上のものは並列的に ハードウェアで実行でき、1クロックで処理できる 3. ループ文の繰り返しはパイプライン化により並列的に実 行でき、パイプライン化することにより現在の繰り返しを 実行途中でも次の繰り返しを並列的に実行できる オプティマイザー処理 • Impulseオプティマイザー(Stage Master)の基 本処理はCの手続きを細分化し各々の処理を 1つかそれ以上のステージに割り当てる、そ れらのステージはハードウェアでの1クロック サイクルで実行される • しかし例外的に特定のステージが外部の資 源を待機している時はデータが来るまで1ク ロックかそれ以上の遅延を引き起こす • ハードウェアコントローラはどのステージが現在実行され ていて、次にどのステージが実行されるかを制御している • オプティマイザーは以下の4つの過程に基づき実行される 1. 内部ループの展開し並列化のためにコードのブロックを 複製する 2. ブロックを実行するためのスケジューリングを行い可能な 限り最小限のステップ数、ステージ数に抑える 3. 個々のステージの遅延のバランスを取る 4. 次(またはその先も含む)の繰り返しをいつ現在の繰り返 しと並列処理するかを資源の制限と繰り返しの相関につ いて分析し決定する 計算式レベルでの最適化 • オプティマイザーは自動的に複数の式や文の並列化を行う、例えば以下 のコード X = a + b + c; X = X << 2; Y = a - c; ではオプティマイザーは最初の文の2つの加算、2文目のシフト演算、そ して3つ目の減算を1つのステージに割り当てる しかし多くの処理が1つのステージ内に割り当てられていると最大クロッ ク速度は著しく低下する(これは処理の実行に必要な回路の大きさに関 係なく各々のステージは1サイクルで実行されるからである) 但しImpulse C付属のStageDelayを用いることによりプログラマーはオプ ティマイザーが1ステージに割り当ててしまったことによる最長の遅延の 原因を特定し制御することができる ブロック内での最適化 • 基本的なブロックとは if,while など介入制御文を必要 としない連続的な固まりのことである、例えば if(odd){ x = a+b+c; x = x << 2; } y = a – c; という固まりにおいてオプティマイザーは (a + b + c) << 2 を第1ステージに割り当て、a – cの実行を 第2ステージに割り当てる
© Copyright 2024 ExpyDoc