1. 概要

本ページでは科学技術計算系のシミュレータを高速化する技術について、 簡単なサンプルプログラムとともに説明します。
高速化技術として以下のものを扱います。

  1. SIMD (Single Instruction Multiple Data) [1][2]
    これはベクトル演算に分類されるもので、 CPUの拡張命令を使用することにより長ビット(128ビットまたは256ビット)演算を行い、 複数個の演算を1サイクルで行うことにより、計算時間を短縮するものです。 並列化と併用することが可能です。
    現在のほぼすべてのCPUはSIMD機能を持っています。

  2. OpenMP [3][4]
    これは共有メモリー型並列計算に分類されるもので、 ソースコードに並列計算のための指示文を代入し、 コンパイラがその指示文を元に並列計算する実行プログラムを生成します。
    計算時間のかかる繰り返し処理(for文)の前に指示文を挿入するだけで計算時間を短縮することができます。
    計算時間の主要部が単純なアルゴリズムであれば、 簡単なプログラミングで高い実行性能を得ることができます。
    現在多くのコンパイラがOpenMPをサポートしています。

  3. マルチスレッド [5]
    これは共有メモリー型並列計算に分類されるもので、 複数のスレッドを起動し処理を分配することにより計算時間を短縮するものです。
    OpenMPもマルチスレッドの一種ですが、ここでは別に扱います。 OpenMPと比べて並列処理の細かい設定を行うことができますが、 プログラムはその分複雑になります。
    マルチスレッドはOSレベルでサポートされていますのでどのような環境でも動作します。

  4. MPI (Message Passing Interface) [6]-[10]
    これは分散メモリー型並列計算に分類されるもので、 複数のプロセスを起動し処理を分配することにより計算時間を短縮するものです。
    プロセス間のデータのやりとりは通信用の関数を呼び出すことによって行います。
    通常、配列をプロセス間で分配する必要があり、その部分のプログラミングが面倒になります。
    計算ノードを増やすことにより(クラスタ)、速度向上に上限はありません。

  5. CUDA [11]-[14]
    これはNVIDIAのグラフィックスボード(GPU)の高い演算能力を科学技術演算に利用するものです。 (GPGPU:General-Purpose computation on Graphics Processing Units)
    CPUは計算の制御を行い、計算時間のかかる部分はGPUで行います。
    GPUでは計算時間のかかるループを多数のスレッドに分解し並列計算します。
    GPUは専用の高速メモリーを持っており、高速な計算を可能にしています。

  6. OpenCL [15]-[20]
    これはCUDAとほぼ同じ技術です。 NVIDIAとAMDのグラフィックスボードに加えCPU[21]でも動作します。
    ソースコードレベルでいろいろな環境に移植することができます。 そのためにプログラムはCUDAに比べるとやや冗長になります。

  7. CUDA + マルチGPU
    1台のコンピュータが複数のNVIDIAのグラフィックスボード(GPU)を持っているとき、 それらを使用して計算するものです。
    streamを使用する方法とOpenMPを使用する方法の2通りがあります。

  8. CUDA + MPI
    1台のコンピュータが複数のNVIDIAのグラフィックスボード(GPU)を持っているとき、 または複数台のコンピュータが1個以上のNVIDIAのグラフィックスボード(GPU)を持っているとき、 それらをすべて使用して計算するものです。
    CUDAとMPIの両方を実装します。

  9. OpenCL + MPI
    NVIDIAまたはAMDのグラフィックスボード(GPU)を持った複数台のコンピュータで計算するものです。
    OpenCLとMPIの両方を実装します。

  10. XeonPhi [22]
    これはインテルの専用コプロセッサーを用いて高速に計算するものです。 OpenMPによる並列化と512ビットベクトルレジスター(AVX512)を用いたSIMD演算を併用します。