メモリ管理 ========== 本節では :math:`{\mathcal H}\Phi` が大規模計算でメモリを管理する方法を説明します。 メモリ要件 ---------- :math:`{\mathcal H}\Phi` の主要なメモリ使用量は状態ベクトルの格納に起因します。 次元 :math:`D` のヒルベルト空間を :math:`P` 個のMPIプロセスに分散する場合、 各プロセスに必要なメモリは: **Lanczos法** - 2つの状態ベクトル(``v0``, ``v1``): :math:`2 \times D/P \times 16` バイト(complex double) - MPI通信用バッファ1つ: :math:`D/P \times 16` バイト **LOBPCG法** - 部分空間反復のための複数の状態ベクトル - 直交化のためのバッファ **リスト配列** - ``list_1``: :math:`D/P \times 8` バイト(unsigned long) - ``list_2_1``, ``list_2_2``: システムサイズに依存 メモリ割り当て -------------- :math:`{\mathcal H}\Phi` は ``common/setmemory.c`` で定義されたラッパー関数を使用して 動的にメモリを割り当てます。これらの関数は様々なデータ型の割り当てを処理します: - ``d_1d_allocate``: 1次元double配列 - ``cd_1d_allocate``: 1次元complex double配列 - ``i_2d_allocate``: 2次元integer配列 - ``lui_1d_allocate``: 1次元unsigned long integer配列 メモリは計算の開始時に ``xsetmem.c`` で割り当てられ、 終了時に解放されます。 メモリ使用量の推定 ------------------ 計算を実行する前に、必要なメモリを推定できます: .. math:: M_{\text{total}} \approx \frac{D}{P} \times (N_v \times 16 + N_l \times 8) \text{ バイト} ここで: - :math:`D` はヒルベルト空間の次元 - :math:`P` はMPIプロセス数 - :math:`N_v` は状態ベクトルの数(Lanczosでは通常3-4) - :math:`N_l` はリスト配列の数(通常1-3) **例** 上向き4個・下向き4個(:math:`S_z = 0`)の16サイトHubbardモデルの場合: - ヒルベルト空間: :math:`D = \binom{16}{4}^2 = 1,820^2 = 3,312,400` - 4 MPIプロセスの場合: :math:`D/P = 828,100` 状態/プロセス - プロセスあたりのメモリ: 状態ベクトルで約50 MB メモリ最適化戦略 ---------------- **MPIプロセス数の増加** ヒルベルト空間をより多くのプロセスに分散することで、 プロセスあたりのメモリ要件を削減できます。 **対称性の利用** 粒子数保存、 :math:`S_z` 保存、その他の対称性により ヒルベルト空間の次元を削減できます。 **リスタート機能** 非常に大規模な計算では、リスタート機能により 計算をより小さなチャンクに分割できます。 よくあるメモリの問題 -------------------- **メモリ不足エラー** 計算でメモリ不足が発生した場合、以下を試してください: 1. MPIプロセス数を増やす 2. 対称性制限を使用する 3. クラスタシステムでノードあたりのメモリを増やす **メモリリーク** :math:`{\mathcal H}\Phi` はメモリリークを避けるように注意深くメモリを管理しています。 メモリ使用量の増加が観察された場合は、バグとして報告してください。