多くのメモリを必要とするコンピューター シミュレーションを C++ で作成しました。これは反復して実行され、各反復で大量のメモリが割り当てられ、反復の最後に解放する必要があります。また、C++ 11 の実装を使用<thread>
して並列処理を実行します。
私のデスクトップ マシンでプログラムをテストすると、問題なく動作します。許可したメモリを超えることはなく、時間と反復の間に何もスタックしません。しかし、プログラムを計算クラスターに送信すると、使用メモリ (キューイング ソフトウェアを介してのみアクセスできる) が時間とともに増加し、私のマシンで使用されているメモリをはるかに超えます。
最初に、ソフトウェアがどのように構成されているかを大まかに示します。
for thread in n_threads:
vector<Object> container;
for iteration in simulation:
container.clear()
container.resize(a_large_number)
... do stuff ...
私のマシンでは、コンテナが2GB
メモリを使い果たしたとしましょう。これらが決して超えられないことhtop
がわかります。何も積もらない。ただし、クラスターでは、メモリがどんどん増えていき、それをはるかに超えるようになります(そして、ジョブが強制終了されたり、計算ノードがフリーズしたりします...)。両方のマシンのスレッド数を制限しており、それらが等しいことを確認できることに注意してください。valgrind --tool=massif
2GB
2GB
私が知っているのlibc
は、クラスター上の が非常に古いということです。プログラムをコンパイルするには、新しいバージョンの をコンパイルし、クラスターのフロント ノードでg++
を更新する必要がありました。libc
ソフトウェアは計算ノードで正常に動作しますが (このメモリの問題を除いて)、libc はかなり古いものです。これは、特にスレッド化と一緒に、メモリ割り当ての問題になる可能性がありますか? どうすればそれを調査できますか?