OpenMP並列化 ============ 本節では :math:`{\mathcal H}\Phi` がOpenMPを利用した共有メモリ並列化について説明します。 概要 ---- :math:`{\mathcal H}\Phi` はOpenMPを使用して、各MPIプロセス上のローカルヒルベルト空間に対する 演算を並列化します。このハイブリッドMPI+OpenMPアプローチにより、 現代のマルチコア計算ノードを効率的に利用できます。 並列化される演算 ---------------- 以下の演算がOpenMPで並列化されます: **ハミルトニアン・ベクトル乗算** 反復固有値ソルバーの主要な計算カーネル。各スレッドがローカル状態ベクトルの 一部を処理します。 **対角行列要素** オンサイト相互作用と化学ポテンシャルの評価。 **内積とノルム** LanczosおよびLOBPCGアルゴリズムに必要なベクトル演算。 **期待値** エネルギー、スピン相関、電荷相関などの物理量の計算。 スレッドセーフな実装 -------------------- 複数のスレッドが共有データ構造を更新する際の競合状態を避けるために 注意が必要です。 :math:`{\mathcal H}\Phi` は以下の戦略を使用します: **分離した累積** 各スレッドは別々のメモリ位置に結果を累積し、 その後シリアル部分またはOpenMPのreduction句を使用して結合します。 **読み取り専用の共有データ** ハミルトニアンパラメータと状態インデックス配列は 並列領域内では読み取り専用です。 スレッド数の設定 ---------------- OpenMPのスレッド数は ``OMP_NUM_THREADS`` 環境変数で制御されます: .. code-block:: bash export OMP_NUM_THREADS=4 mpirun -np 2 ./HPhi -e namelist.def 最適なパフォーマンスのために、MPIプロセス数とOpenMPスレッド数の積は 利用可能なCPUコア数と一致させるべきです。 パフォーマンスの考慮事項 ------------------------ **負荷分散** ローカルヒルベルト空間はデフォルトでスレッド間で均等に分割されます。 対称性制限のある系では、一部のスレッドがより多くの作業を持つことがあります。 **メモリ帯域幅** ハミルトニアン・ベクトル乗算はしばしばメモリ律速です。 スレッド数を最大化するよりも、キャッシュ局所性の良い 少ないスレッド数の方が効率的な場合があります。 **NUMAの影響** NUMAシステムでは、メモリアフィニティがパフォーマンスに大きく影響します。 スレッドピニングのために ``OMP_PROC_BIND`` と ``OMP_PLACES`` の使用を検討してください。