0

多くのメモリを必要とするコンピューター シミュレーションを 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=massif2GB2GB

私が知っているのlibcは、クラスター上の が非常に古いということです。プログラムをコンパイルするには、新しいバージョンの をコンパイルし、クラスターのフロント ノードでg++を更新する必要がありました。libcソフトウェアは計算ノードで正常に動作しますが (このメモリの問題を除いて)、libc はかなり古いものです。これは、特にスレッド化と一緒に、メモリ割り当ての問題になる可能性がありますか? どうすればそれを調査できますか?

4

1 に答える 1