Mam aplikację, która korzysta z OpenMPI i uruchom go w systemie Windows i Linux. Wersja Windows działa dobrze, działa jednak na Linux powodować błąd alokacji pamięci. Problem występuje dla niektórych argumentów aplikacji, które wymagają więcej obliczeń. Aby wyeliminować przecieki pamięci, sprawdzałem aplikację Version Linux za pomocą Valgrind i dostałem trochę Wyjście. W końcu próbowałem wyszukać informacje o wyjściu i znalazłem niektóre posty na przepełnieniu stosu i Github (za mało reputacji do dołączenia linków). W końcu zaktualizowałem OpenMPI do 2.0.2 i ponownie sprawdzaj aplikację. Nowy Wyjście. Czy pamięć nie wyciekuje się w OpenMpi lub robię coś złego?

Kawałek wyjścia:

==16210== 4 bytes in 1 blocks are definitely lost in loss record 5 of 327
==16210==    at 0x4C2DBB6: malloc (vg_replace_malloc.c:299)
==16210==    by 0x5657A59: strdup (strdup.c:42)
==16210==    by 0x51128E6: opal_basename (in /home/vshmelev/OMPI_2.0.2/lib/libopen-pal.so.20.2.0)
==16210==    by 0x7DDECA9: ???
==16210==    by 0x7DDEDD4: ???
==16210==    by 0x6FBFF84: ???
==16210==    by 0x4E4EA9E: orte_init (in /home/vshmelev/OMPI_2.0.2/lib/libopen-rte.so.20.1.0)
==16210==    by 0x4041FD: orterun (orterun.c:818)
==16210==    by 0x4034E5: main (main.c:13)

Wersja OpenMpi: Open MPI: 2.0.2
Wersja Valgrind: Valgrind-3.12.0
Wirtualna cecha mashine: Ubuntu 16.04 LTS X64

W przypadku korzystania z MPICH wyjście Valgrind jest:

==87863== HEAP SUMMARY:
==87863==     in use at exit: 131,120 bytes in 2 blocks
==87863==   total heap usage: 2,577 allocs, 2,575 frees, 279,908 bytes allocated
==87863== 
==87863== 131,120 bytes in 2 blocks are still reachable in loss record 1 of 1
==87863==    at 0x4C2DBB6: malloc (vg_replace_malloc.c:299)
==87863==    by 0x425803: alloc_fwd_hash (sock.c:332)
==87863==    by 0x425803: HYDU_sock_forward_stdio (sock.c:376)
==87863==    by 0x432A99: HYDT_bscu_stdio_cb (bscu_cb.c:19)
==87863==    by 0x42D9BF: HYDT_dmxu_poll_wait_for_event (demux_poll.c:75)
==87863==    by 0x42889F: HYDT_bscu_wait_for_completion (bscu_wait.c:60)
==87863==    by 0x42863C: HYDT_bsci_wait_for_completion (bsci_wait.c:21)
==87863==    by 0x40B123: HYD_pmci_wait_for_completion (pmiserv_pmci.c:217)
==87863==    by 0x4035C5: main (mpiexec.c:343)
==87863== 
==87863== LEAK SUMMARY:
==87863==    definitely lost: 0 bytes in 0 blocks
==87863==    indirectly lost: 0 bytes in 0 blocks
==87863==      possibly lost: 0 bytes in 0 blocks
==87863==    still reachable: 131,120 bytes in 2 blocks
==87863==         suppressed: 0 bytes in 0 blocks
==87863== 
==87863== For counts of detected and suppressed errors, rerun with: -v
==87863== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) 
2
Vadim Shmelev 16 luty 2017, 11:42

2 odpowiedzi

Najlepsza odpowiedź

Wyjścia te wskazują na niektóre wycieki pamięci w bibliotece MPI, a nie kod aplikacji. Możesz je zignorować je.

Dokładniej, te wycieki pochodzą z wyrzutni. ORTE jest środowiskiem wykonawczym dla OpenMPI odpowiedzialny za uruchomienie i Zarządzanie procesami MPI. Hydra jest programem wyrzutnią i procesem dla MPICH.

1
Sourav 16 luty 2017, 19:48

Termin "zdecydowanie zagubiony" oznacza główną funkcję programu w linii 13 (o ile widzę na wyjściu) jest przeciekanie pamięci bezpośrednio lub wywołuje inną funkcję (orterun), co powoduje wyciek pamięci. Musisz naprawić te wycieki lub podać więcej swojego kodu.

Spojrzenie Oto przed wszystkim.

0
m.r226 16 luty 2017, 09:22