並列計算 — CAE用語解説
理論と物理
並列計算の基本概念
並列計算って、単に複数のCPUを使うことですか?それとももっと根本的に、計算の仕組みが変わるんですか?
根本的に変わります。並列計算は、一つの大きな問題を複数の小さな部分問題に分割し、複数のプロセッサ(コア)で同時に解く計算パラダイムです。例えば、100万自由度の剛性マトリクスを1コアで解くのと、4コアで領域分割して解くのでは、アルゴリズム自体が異なります。並列化の効率は「並列化効率」で評価され、理想的な4コアでのスピードアップは4倍ですが、実際は通信オーバーヘッドで3.2倍程度になることが多いです。
通信オーバーヘッドとは具体的に何ですか?メモリの読み書きが遅いということ?
プロセッサ間でデータをやり取りする時間です。共有メモリ型(1台のマシン内の複数コア)では、キャッシュコヒーレンシの維持がオーバーヘッドになります。分散メモリ型(複数マシン、クラスター)では、InfiniBandなどの高速ネットワークを介したメッセージ通信(MPI)がボトルネックになります。例えば、領域分割法で隣接領域の境界条件を同期する際、各計算ステップで通信が発生します。通信時間が計算時間に対して無視できない割合を占めると、コア数を増やしても速くならなくなります。これはアムダールの法則で説明され、並列化可能部分の割合Pが95%でも、コア数∞倍での理論限界スピードアップは
「領域分割」というのがよく出てきますが、CAEではメッシュを物理的にバラバラに切って計算するってことですか?つながりはどうなるんですか?
その通り、メッシュを複数のサブドメイン(領域)に分割し、各サブドメインを異なるプロセッサに割り当てます。つながりは、隣接するサブドメイン間の境界面上にある節点(インターフェース節点)のデータを、計算中に随時交換・同期させることで保ちます。例えば、Abaqus/Standardの並列処理では、この領域分割を自動で行い、各領域の方程式を部分構造法やSchur補元法を用いて並列に解きます。分割の良し悪しが計算効率を大きく左右し、各領域の要素数が均等で、かつ境界面の長さ(通信量)が最小になるような分割が求められます。
数値解法と実装
並列化の手法とライブラリ
CAEソフトはどうやって並列計算を実現しているんですか?プログラミングのレベルで教えてください。
主に2つのプログラミングモデルを組み合わせて使います。1つは「共有メモリ並列(OpenMP)」で、1台のマシンの複数コアで、forループの反復計算などを分割します。もう1つは「分散メモリ並列(MPI)」で、複数マシンや多くのコアに跨って、大規模な連立一次方程式の求解や領域分割を行います。例えば、Ansys Mechanicalの並列ソルバーは、直接法ソルバー(スパースソルバー)では主にOpenMP、反復法ソルバー(PCGなど)ではMPIを多用します。実際のコードでは、#pragma omp parallel for(OpenMP)やMPI_Send/MPI_Recv(MPI)といった指令を挿入します。
MPIとOpenMPはどちらか一方を選ぶものなんですか?それとも両方使うとさらに速くなるんですか?
ハイブリッド並列として両方使うのが、現代のHPC(高性能計算)の標準です。例えば、128コアのクラスター(16ノード×8コア)を使う場合、MPIで16プロセスを立ち上げ(1ノードに1プロセス)、各ノード内の8コアではOpenMPで並列化します。これにより、MPIだけの場合に比べてノード間の通信プロセス数が減り、通信オーバーヘッドを低減できます。実際、大規模CFD解析で、純MPIとHybrid(MPI+OpenMP)を比較すると、後者の方が全体の計算時間を10〜20%短縮できるケースがあります。
連立一次方程式の求解で、直接法と反復法で並列化の向き不向きがあると聞きました。具体的にどう違うんですか?
大きな違いがあります。直接法(LU分解など)は演算量が多くメモリ消費も大きいですが、アルゴリズム自体の並列化は比較的難しく、数百コア程度が実用限界です。一方、反復法(共役勾配法:CG法など)は、行列ベクトル積
実践ガイド
効率的な並列計算のための設定
実際に解析ジョブを投げる時、コア数は多ければ多いほどいいんですか?最適なコア数の決め方はありますか?
むやみに多くしても無駄です。最適コア数は「強スケーリング」テストで決めます。問題規模(メッシュ数)を固定し、コア数を1, 2, 4, 8...と増やして計算時間を計測します。計算時間がほとんど減らなくなったり、むしろ増え始める(通信オーバーヘッドが支配的になる)ポイントが、その問題に対する実質的なコア数の上限です。経験則として、100万要素の構造解析では8〜16コア、1000万要素の大規模CFDでは64〜128コアが効率的な範囲であることが多いです。Ansys Fluentの場合は、ソルバータイプ(Pressure-BasedかDensity-Basedか)でも最適コア数が変わります。
ジョブを投入する時に「MPIのプロセス数」と「OpenMPのスレッド数」を指定しますが、この割り振りはどう決めればいいですか?
使用するハードウェア構成に依存します。基本方針は「1ノードあたり1つのMPIプロセスを立て、そのノード内の全コアをOpenMPスレッドで使う」です。例えば、4ノードのクラスターで、各ノードが20コア(40スレッド)のCPUの場合、MPIプロセス数=4、OpenMPスレッド数=40と設定します。ただし、メモリが足りない場合(1ノードのメモリでは問題が大きすぎる)は、1ノード内で複数のMPIプロセスを立ち上げ、スレッド数を減らすこともあります。COMSOL Multiphysicsのクラスター計算設定画面では、このバランスを直感的に設定できるようになっています。
並列計算で結果が逐次計算と微妙に違うことがあると聞きました。これはバグですか?
バグではなく、浮動小数点演算の順序の違いによるものです。並列計算では、加算や内積の演算順序がコアごとにバラバラになるため、丸め誤差の蓄積が逐次計算と異なります。これは本質的な問題で、反復法ソルバーの収束履歴や、最終的な変位値の下位10桁目あたりに影響が出ることがあります。ただし、相対誤差はマシンイプシロン
ソフトウェア比較
主要CAEソフトの並列実装
Ansys、Abaqus、COMSOLで、並列計算のアプローチに違いはありますか?
大きく異なります。Ansys Mechanicalは、ソルバー(直接法/反復法)ごとに並列化戦略が分かれています。直接法ソルバー(スパース)は共有メモリ型(OpenMP)が中心で、最大32コア程度が推奨です。一方、反復法ソルバー(PCG, ICCG)は分散メモリ型(MPI)に強く、数百コアまでスケールします。Abaqus/Standardは「Domain Level Parallelism」が特徴で、初期段階でメッシュを領域分割し、その後の全ての処理(要素行列生成、接触探索、求解)を並列化します。COMSOLは「クラスターノード」と「共有メモリ」の両方のモードをサポートし、特にマルチフィジックス連成問題で、物理場ごとに異なる領域分割を適用できる柔軟性があります。
接触問題の並列計算は難しいと聞きます。どのソフトが一番効率的に処理できるんですか?
接触は並列化の難所です。なぜなら、接触ペアの探索と拘束条件の適用は、領域を跨いで頻繁にデータ交換が必要になるからです。この点で、Abaqusの並列接触アルゴリズムは評価が高く、接触面を自動的に複数の領域に分割し、効率的な並列探索を行います。一方、Ansys Mechanicalでは、接触領域が狭く局所的な場合は並列効率が良いですが、広範囲にわたる面接触では、接触探索の並列オーバーヘッドが大きくなりがちです。LS-DYNAのような顯式動解析ソフトでは、接触アルゴリズムそのものが並列化されている(並列接触検出)ため、数千コアでの衝撃解析も可能です。
GPUを使った並列計算は、これらのCPUベースの並列とどう違うんですか?対応しているソフトは?
根本的にアーキテクチャが異なります。GPUは数千個の軽量コアを持ち、単一命令複数データ(SIMD)型の並列処理に特化しています。CAEでは、反復法ソルバー中の行列ベクトル積や、顯式法の要素計算のような、均質で大量の演算を並列化するのに向いています。対応ソフトとしては、Abaqus/ExplicitがGPUアクセラレーションをサポートし、特定の要素タイプで10倍以上の高速化を報告しています。Ansys Fluentも、2023R1以降でNVIDIA GPU向けのネイティブサポートを開始しました。ただし、GPUメモリ容量(現在最高で80GB)が問題規模の上限を決めるため、超大規模モデルではCPUクラスターの方が有利です。
トラブルシューティング
並列計算のよくあるエラーと対策
並列計算を始めたら、「MPIプロセスがタイムアウトしました」というエラーでジョブが落ちます。原因は何ですか?
主に3つの原因が考えられます。1つ目はネットワーク問題で、クラスターのノード間通信(InfiniBandスイッチの不調など)でパケットロスが発生しています。2つ目はリソース不足で、メモリ不足によりスワップが発生し、プロセスの応答が遅くなっています。3つ目はソルバーの発散で、あるプロセスで数値的不安定性が起き、他のプロセスからの通信を待たずに停止してしまう場合です。まずは、逐次計算で問題が解けるか、使用メモリ量を確認してください。次に、MPIのタイムアウト時間を環境変数(例:MPIEXEC_TIMEOUT)で延長してみます。
コア数を増やしたら、かえって計算時間が長くなりました。これはあり得るんですか?
あり得ます。これは「並列オーバーヘッド」が計算時間を上回った典型的な例です。特に、問題規模に対してコア数が多すぎる場合(例えば、10万要素のモデルで128コア使用)に起こります。各コアが担当する要素数が極端に少なくなり、通信と同期の時間の割合が支配的になるからです。対策は、強スケーリングテストを行い、計算時間が最小になる「最適コア数」を見つけることです。また、Ansysの場合、ソルバータイプ(直接法か反復法か)を問題規模に合わせて切り替えることも有効です。小規模モデルでは直接法の方が速いことが多いです。
並列計算で得られた応力結果に、領域の境界で不連続な「線」が見えることがあります。これはメッシュの分割が悪いサインですか?
その通りです。これは「領域分割境界アーティファクト」と呼ばれる現象で、サブドメイン間のインターフェース節点での結果が完全に一致していないことを示しています。原因は主に2つ。1つは、反復法ソルバーの収束判定値(残差ノルム)が緩すぎて、領域境界での微小な不連続が許容されてしまっている場合。もう1つは、要素形状や材料が領域境界で不連続に分割され、数値的な「切れ目」が生じている場合です。対策としては、ソルバーの収束条件を厳しくする(例えば、残差ノルムを1e-8から1e-10にする)、またはメッシュ分割アルゴリズムを変更し(METISやSCOTCHなど)、要素の連続性を保ちながら分割するように設定します。Abaqusでは、*PRINT, FIELD出力で領域番号を可視化し、分割状態を確認できます。
関連トピック
なった
詳しく
報告