並列計算
大きな問題を解いたり、大量のデータを処理したりする過程は、より小さなサブタスクやサブデータグループの処理に分割できることが多い、という事実を利用して単位時間あたりの処理効率(スループット)の向上を図る手法である。
並列処理(並列計算)はスーパーコンピュータでは以前から採られている手法である。スーパーコンピュータの高い性能は、プロセッサ数やノード数がパーソナルコンピュータに比べて極めて多く、並列処理性能が高いことで実現している。
並列計算のために設計されたコンピュータは並列コンピュータという。並列コンピュータは当初スーパーコンピュータなどの高価で大規模なシステムのみに見られる設計だったが、パーソナルコンピュータや携帯機器でもCPUをマルチコア化し並列処理をさせることが当たり前になってきた。CPUのクロック周波数を上げることで処理性能向上させることには限界や問題が見えてきたからこの手法が採用されるようになった。
また並列処理に特化したコプロセッサであるGPUも、個人が(比較的気軽に)購入できる価格帯で販売されるようになってきており、PCに後付で搭載する形での使用も広まっている。GPUは当初は主に、コンピュータゲームの3DCGレンダリングなどの画像処理に使われていたので「GPU」と呼ばれることになったが、実際には並列処理全般に使うことができるものであり、こうした使用法をGPGPUといい、今ではディープラーニングや暗号通貨のマイニングなど、現実的な時間内に処理しようとすると並列処理が必要となるさまざまな用途で使われるようになっている。
対称型マルチプロセッサ(SMP)は、複数個のプロセッサがメモリを共有し、バスで相互接続された形態のコンピュータである。バスがボトルネックとなるため、スケーラビリティは制限される。そのため、SMPは一般に32プロセッサを越えることはない。大型のキャッシュメモリを使って必要なバス帯域幅を低減して十分なメモリ帯域幅が確保できるなら、対称型マルチプロセッサは極めて費用対効果が高い。
CPU間の通信は非常に高速なインターコネクトで行われる。
TOP500で2007年まで世界最高速のスーパーコンピュータとされていた Blue Gene/L はMPPである。
グリッド・コンピューティング
グリッド・コンピューティングは、並列計算の中でも最も分散された形態である。遠隔にあるコンピュータをインターネットで相互接続して構成され、1つの問題を共同して解く。インターネットは利用可能な帯域幅が低く、レイテンシが大きいため、自明な並列性を持つ問題に使われることが多い。グリッド・コンピューティングを利用した分散コンピューティングプロジェクトが数多くあり、SETI@homeやFolding@homeがよく知られている。
多くのグリッド・コンピューティングは、オペレーティングシステムとアプリケーションの間に特有のミドルウェアを置き、ネットワークリソースの管理やアプリケーション向けのインタフェースの標準化を行っている。よく知られたグリッド・コンピューティング用ミドルウェアとして、Berkeley Open Infrastructure for Network Computing (BOINC) がある。グリッド・コンピューティング用ソフトウェアでは、コンピュータが何もしていない時間を使うため、その時間を「スペアサイクル(spare cycles)」と呼ぶことが多い。
データ並列性はプログラムのループが本質的に備えている並列性であり、ループの各周回が各ノードで並列に処理されるようデータを配布する部分が中心となる。並列化されるループは、大きなデータ構造の各要素について似たような処理を行うものである。科学技術計算にはデータ並列性があることが多い。
ループ伝搬依存(loop-carried dependency)とは、ループにおいて以前の周回の結果に依存して新たな周回の計算が行われる性質をいう。ループ伝搬依存があると、ループの並列化はできない。例えば、以下のフィボナッチ数の一部を計算する擬似コードを考えてみよう。
このループでは、CUR が以前の CUR の値と PREV に依存しており、その値は周回ごとに再計算されるため、並列化できない。つまり、ある周回での計算は、それ以前の周回の計算結果に依存しているため、周回ごとに並列化することはできないのである。
問題が大きくなるほど、可能なデータ並列性も多くなる傾向がある。
並列処理専用のマシンには、利用分野が限定されているものや、特定の並列問題のクラスしか解けないものもある。
GPGPU(General-purpose computing on GPU)は、CPUを遥かに凌駕する理論演算性能および電力効率を持つGPUを汎用計算に用いるものである。GPUはリアルタイムコンピュータグラフィックス処理に最適化されたコプロセッサであり、線形代数演算(行列演算・ベクトル演算)をデータ並列で処理することに特化しているが、プログラマブルシェーダーの出現と発展により汎用計算への応用の道が開いた。GPGPUは、もともとGPUが得意とする画像処理全般への適用や、大量の演算が必要となる機械学習の分野における活用が進んでいる。ただしCPUとGPUは設計思想の違いからそれぞれ得意分野が異なるため、(スパコンを使っても必ずしも高速にならないのと同様に)ありとあらゆる処理をGPUによる並列計算で高速化しようと試みることは現実的ではない。
NVIDIA GeForce/NVIDIA Quadro、AMD Radeon/AMD FireProといったパーソナルコンピュータやワークステーション向けのグラフィックスプロセッサをGPGPU目的に利用できるほか、NVIDIA TeslaシリーズやAMD FirePro Sシリーズ(旧AMD FireStream)といったGPGPU専用のサーバ向けハードウェアも出現している。
並列コンピュータの主記憶は、共有メモリ型(全プロセッサが単一の物理アドレス空間を共有する)と分散メモリ型(各プロセッサがローカルな独自の物理アドレス空間を持つ)に分けられる。分散メモリは、メモリが論理的に分散しているためにそのように呼ばれるが、実際には物理的にも分散していることが多い。分散共有メモリはこの2つの方式を組み合わせたものであり、各プロセッサはローカルなメモリとローカルでないメモリの両方にアクセスできる。この場合、ローカルなメモリへのアクセスはローカルでないメモリへのアクセスよりも一般に高速である。
全主記憶に同じレイテンシおよび帯域幅でアクセスできるコンピュータアーキテクチャを UMA (Uniform Memory Access) と呼ぶ。これは共有メモリシステム(メモリが物理的に分散していない場合)しか実現できない。それ以外のアーキテクチャはNUMA (Non-Uniform Memory Access) と呼ぶ。分散メモリシステムはNUMAである。
コンピュータにはキャッシュメモリが使われていることが多く、(物理的にも論理的にも)プロセッサの近くに高速かつ小容量のメモリを配置し、主記憶の内容のコピーを一時的に保持する。