6.4. メモリ管理

本節では \({\mathcal H}\Phi\) が大規模計算でメモリを管理する方法を説明します。

6.4.1. メモリ要件

\({\mathcal H}\Phi\) の主要なメモリ使用量は状態ベクトルの格納に起因します。 次元 \(D\) のヒルベルト空間を \(P\) 個のMPIプロセスに分散する場合、 各プロセスに必要なメモリは:

Lanczos法
  • 2つの状態ベクトル(v0, v1): \(2 \times D/P \times 16\) バイト(complex double)

  • MPI通信用バッファ1つ: \(D/P \times 16\) バイト

LOBPCG法
  • 部分空間反復のための複数の状態ベクトル

  • 直交化のためのバッファ

リスト配列
  • list_1: \(D/P \times 8\) バイト(unsigned long)

  • list_2_1, list_2_2: システムサイズに依存

6.4.2. メモリ割り当て

\({\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 で割り当てられ、 終了時に解放されます。

6.4.3. メモリ使用量の推定

計算を実行する前に、必要なメモリを推定できます:

(6.5)\[M_{\text{total}} \approx \frac{D}{P} \times (N_v \times 16 + N_l \times 8) \text{ バイト}\]

ここで:

  • \(D\) はヒルベルト空間の次元

  • \(P\) はMPIプロセス数

  • \(N_v\) は状態ベクトルの数(Lanczosでは通常3-4)

  • \(N_l\) はリスト配列の数(通常1-3)

上向き4個・下向き4個(\(S_z = 0\))の16サイトHubbardモデルの場合:

  • ヒルベルト空間: \(D = \binom{16}{4}^2 = 1,820^2 = 3,312,400\)

  • 4 MPIプロセスの場合: \(D/P = 828,100\) 状態/プロセス

  • プロセスあたりのメモリ: 状態ベクトルで約50 MB

6.4.4. メモリ最適化戦略

MPIプロセス数の増加

ヒルベルト空間をより多くのプロセスに分散することで、 プロセスあたりのメモリ要件を削減できます。

対称性の利用

粒子数保存、 \(S_z\) 保存、その他の対称性により ヒルベルト空間の次元を削減できます。

リスタート機能

非常に大規模な計算では、リスタート機能により 計算をより小さなチャンクに分割できます。

6.4.5. よくあるメモリの問題

メモリ不足エラー

計算でメモリ不足が発生した場合、以下を試してください:

  1. MPIプロセス数を増やす

  2. 対称性制限を使用する

  3. クラスタシステムでノードあたりのメモリを増やす

メモリリーク

\({\mathcal H}\Phi\) はメモリリークを避けるように注意深くメモリを管理しています。 メモリ使用量の増加が観察された場合は、バグとして報告してください。