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. メモリ使用量の推定¶
計算を実行する前に、必要なメモリを推定できます:
ここで:
\(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. よくあるメモリの問題¶
- メモリ不足エラー
計算でメモリ不足が発生した場合、以下を試してください:
MPIプロセス数を増やす
対称性制限を使用する
クラスタシステムでノードあたりのメモリを増やす
- メモリリーク
\({\mathcal H}\Phi\) はメモリリークを避けるように注意深くメモリを管理しています。 メモリ使用量の増加が観察された場合は、バグとして報告してください。