2017-02-12 221 views
1

我正在處理帶有MPI並行化的Fortran代碼,在該代碼中,我的內存不足以進行密集運行。我很小心地分配幾乎所有在模擬開始時所需的內存。子程序靜態內存分配通常很小,但如果由於這些子程序而導致內存不足,則會在模擬的早期發生,因爲內存分配不應該隨着時間的推移而增長。我的問題是,遠到仿真,我遇到了內存不足的錯誤,如:MPI內部緩衝區內存問題

Insufficient memory to allocate Fortran RTL message buffer, message #174 = hex 000000ae.

,我能想到的是,我的MPI調用都是使用內存的唯一的事情,我不能在開始預分配的模擬。在仿真運行時,我主要使用MPI_Allreduce,MPI_Alltoall和MPI_Alltoallv,有時我會傳遞大量數據。內存問題可能是MPI創建的內部緩衝區的結果嗎?我怎樣才能防止這樣的驚喜記憶問題?這個內部緩衝區可以在模擬期間增長嗎?

我看過Valgrind,除了惱人的MPI警告,我沒有看到任何其他內存問題。

回答

0

如果不知道更多細節,這裏有點難以判斷MPI是否有問題。你可以嘗試massif(valgrind工具之一)來找出內存分配的位置。

確保您不會引入任何資源泄漏:如果您創建新的MPI資源(通信器,組,請求等),請確保正確釋放它們。

一般來說,請注意所有通信所需的緩衝區大小,尤其是在大規模情況下。如果可能,請使用MPI_IN_PLACE,或者以小塊而不是單個大塊的方式發送數據。

+0

我將內存問題縮小到執行MPI_Alltoall和MPI_Alltoallv的子例程。另外,我還發現使用1節點(16個處理器)時沒有內存問題,但是當使用2個或更多節點時,內存問題很明顯。任何想法如何這甚至可能?對我來說,似乎這個問題不可能是我編碼的錯誤,但我以前錯了。 – Higgy