1. はじめに

1.1 概要

FDTD法
FDTD法(Finite Difference Time Domain method)[1][2] は電磁界の基礎方程式であるMaxwell方程式を差分法による数値計算する方法であり、 現在電磁界関係の多くの分野の研究開発で使用されています。
そして計算対象が大規模化・複雑化するにつれ多くの計算時間が必要とされています。
従って、HPC(High Performance Computing)技術を利用して高速化を図り計算時間を短縮することが求められています。

本プログラムの目的
本プログラムOpenFDTDの目的は、 広い用途に適用できる汎用的なFDTD法シミュレータをフリーソフトとして提供し、 同時に各種の高速化技術を実装することです。

高速化技術
高速化技術としては現在のハードウェアの進歩に従い、 多数のコアのCPUまたはGPUを用いて並列計算を行うことが主流となっています。
ここでは以下の技術を紹介し実装します。[3]

  1. SIMD (Single Instruction Multiple Data)
    これはベクトル演算に分類されるもので、 CPUの拡張命令を使用することにより長ビット(128ビットまたは256ビット)演算を行い、 複数個の演算を1サイクルで行うことにより、計算時間を短縮するものです。 並列化と併用することが可能です。
  2. OpenMP
    これは共有メモリー型並列計算に分類されるもので、 ソースコードに並列計算のための指示文を代入し、 コンパイラがその指示文を元に並列計算する実行プログラムを生成します。
    計算時間のかかる繰り返し処理(for文)の前に指示文を挿入するだけで計算時間を短縮することができます。
    計算時間の主要部を占める部分が単純なアルゴリズムであれば、 簡単なプログラミングで高い実行性能を得ることができます。
    FDTD法はOpenMPによる並列化に適したアルゴリズムになっています。
  3. MPI (Message Passing Interface)
    これは分散メモリー型並列計算に分類されるもので、 複数のプロセスを起動し処理を分配することにより計算時間を短縮するものです。 プロセス間のデータのやりとりは通信用の関数を呼び出すことによって行います。
    計算ノードを増やすことにより高速化に上限はありません。
    FDTD法はMPIによる並列化に適したアルゴリズムになっています。
  4. CUDA
    これはNVIDIAのグラフィックスボード(GPU)の高い演算能力を科学技術演算に利用するものです。 (GPGPU:General-Purpose computation on Graphics Processing Units)
    CPUは計算の制御を行い、計算時間のかかる部分はGPUで行います。
    GPUでは計算時間のかかるループを多数のスレッドに分解し並列計算します。
    FDTD法はCUDAによる並列化に適したアルゴリズムになっています。
  5. CUDA + MPI
    1台のコンピュータに複数のグラフィックスボードを実装したとき(マルチGPU)と、 複数台のコンピュータに1個または複数のグラフィックスボードを実装したとき、 すべてのグラフィックスボードを使用して並列計算することができます。
    CUDAとMPIの両方を実装します。
  6. XeonPhi
    これはインテルの専用コプロセッサーを用いて高速に計算するものです。 OpenMPによる並列化と512ビットベクトルレジスター(AVX512)を用いたSIMD演算を併用します。