スライド 1

第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ステージに割り当てる