7.1 はじめに
単一のCPUの能力を向上させるには、密度、発熱量的に限界があるので、可能であれば複数のプロセッサ(マルチプロセッサ)を使用してプログラミングを行いたい。”能力を向上…”の能力には色々な意味があるけど、ここでは単位時間当たりの処理量であるスループットを対象とする。マルチプロセッサで、スループットをあげるには全てのプロセッサに別の仕事(ジョブ)を割り当てればよい。
独立したジョブが沢山ある場合の特性を、ジョブレベル並列性(あるいはプロセスレベル並列性)と呼ぶ。
一方、単一のプログラムのコード片を複数のプロセッサで分散処理する場合は、並列処理プログラムと呼ぶ(マルチスレッド的な意味も含む?)。
後者の場合、仮にハードウェアが複数プロセッサ対応できたとしても、ソフトが並列処理可能な形になっていなければ意味が無い。なので、並列処理プログラムをいかに容易に作成できるかの仕組み(言語、ライブラリ)も重要となってくる。
並列処理関係で使われる用語は、一部誤用(というか混乱)があるので、一旦整理しておく
直列 vs 並列
直列(serial) あるプロセスを1つのプロセッサで処理する 並列(parallel) あるプロセスを複数のプロセッサで分散処理する (マルチコア的な意味) |
逐次 vs 同時並行
逐次(sequential) 逐次は1つ目のジョブが終わるまで、2つ目のジョブを開始しない 同時並行(concurrent) 逐次は複数のジョブを時間分割しながら同時並行で作業する (WindowsやUNIXのマルチタスク的な意味) |
上記2つの概念は直交するので、直列で同時並行の仕組みや、並列で逐次のモノも存在する。
以降の説明では、parallelなハードウェア上で動くプログラムを”並列処理プログラム”と表記している。
7.2 並列処理プログラム作成の困難さ
並列処理で難しいのはハードではなく、ソフトウェア側になる。
これは、ソフトウェアはマルチスレッド等で複数の処理を行う場合、処理の分割や、各処理での同期、負荷の平準化の考慮と、それらのオーバーヘッドの考慮が必要となるから。
並列処理で能力を向上させる(スケールさせる)場合の前提条件には以下の2つがある。
強いスケーリング 問題の規模(データ量etc)はそのままで、プロセッサを増やした時に どの程度能力が向上するか 弱いスケーリング 問題の規模と、プロセッサを共に増やした時にどの程度能力が向上するか |
7.3 共有記憶型マルチプロセッサ
共有記憶型マルチプロセッサ(SMP)というのは、複数のCPUが単一の主記憶(物理メモリ)に、均等にアクセスできるハード構成を言う。この構成だと、プログラマはマルチスレッドのような形で処理の並列化だけを気にすればよくなるので、ソフト側の負荷が少ない。
SMPアーキテクチャは、メモリアクセスの方法の違いによって2つに分割される。
UMA:均等メモリアクセス 全てのプロセッサはどのメモリアドレスにも等しい時間でアクセスが出来る。 NUMA:非均等メモリアクセス 全てのプロセッサはメモリアドレスによってアクセス時間が異なる。 |
ソフト側にとってはUMAのほうがプログラミングしやすい。一方ハード側にとってはNUMAのほうがスケールさせやすいハード構成が作れる。
並列処理プログラムでは、処理対象データを共有する事が一般的なので、各処理(スレッド)間での同期処理が必要となる。同期を取るためには、排他(ロック)処理が必要となるが、これは2章で説明している。
7.4 クラスタおよびその他のメッセージ交換型マルチプロセッサ
先ほどの7.3節では全CPUが単一のメモリ空間にアクセスできるパターンを考えたが、本節では各CPUが専用のメモリを持つアーキテクチャを考える。このような仕組みの場合、プロセッサ間(スレッド間)でデータをやり取りするために、メッセージ交換処理が必要となる。
但し、たとえばWebサーバのように各処理間でデータの共有が無い(orほとんど無い)場合もあり、このような際にはメッセージ交換の仕組みは不要となる。
メッセージ交換式の仕組みでスケールさせやすい仕組みの1つが、クラスタ構成になる。
キャッシュ設計者からすると、SMPよりクラスタの方が、キャッシュ整合性の問題がなくなるので、設計が簡単になる。一方ソフト屋からすると、メッセージ交換には非常にコストが掛かる(高レイテンシ)ので、コーディングが難しくなる。
7.5 ハードウエア・マルチスレッディング
本節では、マルチスレッド処理をソフトウェア的なコンテキスト切り替えではなく、ハードで実装するアーキテクチャを考える。
このような場合、CPUはスレッドの数分のレジスタやプログラムカウンタの記憶域を用意する必要がある。
ハードウエア・マルチスレッディングの実装は難しいが、並列化の恩恵だけでなく、CPUがI/O待ち(キャッシュミス等)になった時に替わりに実行できるほかの処理を持つことも出来るので、ハードウェア資源の効率化が出来る。
7.6 SISD,MIMD,SIMD,SPMD,ベクトル
本章のこれまでの話は、ハード構成(マルチコア/クラスタetc)の話だったけど、本節は単一CPU内の命令セットの話になる。
今までは1つの命令で単一データ(レジスタ)の値を演算していたが、もし1命令で複数レジスタの計算を同時に行えれば、能力を向上させる事が可能となる。
このあたりの用語を分類すると、以下のようになる。
SISD 単一命令で単一データを処理する ※SISDのIはInstruction(命令)で、Dはデータを意味している。 SIMD 単一命令で複数データを一気に処理する 例えばIntelのMMX命令のようなもの MIMD 複数の命令ストリームで、複数データを処理する (いわゆるマルチプロセッサ) SPMD 単一のプログラムが全てのプロセッサで、複数データを処理する 一般的名MIMDのモデルらしい?? ※PはProgramの略 |
SIMDが威力を発揮するのは、forループのように大量の配列データに同じ処理を行うような場合になる。
逆にifやswitchなどの分岐が有る処理は苦手になる。
7.7 グラフィックス処理ユニットの概要
7.8 マルチプロセッサ・ネットワーク・トポロジの概要
7.9 マルチプロセッサのベンチマーク
7.10 ルーフライン:単純な性能モデル
7.11 実例:ルーフライン・モデルを用いた4つのマルチコアのベンチマーキング
省略(興味が無いので流し読みしただけ)
7.12 誤信と落とし穴
誤信:Amdahlの法則は並列コンピューティングに適用できない
ソフトを並列化に対応させても、並列処理できない部分が残るので、仮に無数のCPUを用意できたとしても、非並列化部分がボトルネックになる。ただ、データを増やせばスケールさせることは可能となる。ここから得られる知見は、データ量に応じてアルゴリズムの再考慮が必要となるかも。という点になる。
誤信:ピーク性能は現実の性能を反映する
このネタは、前の章でも出た気が…
ピーク性能は理論値だし、他にボトルネックが出来るとピーク値は出せないので余り意味が無い。
落とし穴:マルチプロセッサアーキテクチャを十分に活用した,あるいはそれに最適化したソフトウェアを開発しない事
CPUが並列化を用意しても、例えばOS等のレイヤで処理の直列化がされていたら、ユーザプログラムを工夫しても並列化のメリットを享受できない。
7.13 おわりに
省略7.14 歴史展望と参考文献(◎CDコンテンツ)
省略7.15 演習問題
省略
関連記事
コメントを残す