Утечка памяти MPI - PullRequest
       34

Утечка памяти MPI

8 голосов
/ 12 декабря 2011

Я пишу некоторый код, который использует MPI, и я продолжал замечать некоторые утечки памяти при запуске его с valgrind. Пытаясь определить, где была проблема, я закончил с этой простой (и совершенно бесполезной) основной:

#include "/usr/include/mpi/mpi.h"

int main(int argc,char** argv)
{
MPI_Init(&argc, &argv);
MPI_Finalize();
return 0;
}

Как видите, этот код ничего не делает и не должен создавать никаких проблем. Однако, когда я запускаю код с помощью valgrind (как в последовательном, так и в параллельном случае), я получаю следующую сводку:

== 28271 == РЕЗЮМЕ КАРТЫ:

== 28271 == используется на выходе: 190 826 байт в 2745 блоках

== 28271 == общее использование кучи: 11 214 распределений, 8 469 освобождений, 16 487 977 байт

== 28271 ==

== 28271 == РЕЗЮМЕ УТЕЧКИ:

== 28271 == определенно потеряно: 5,950 байт в 55 блоках

== 28271 == косвенно потеряно: 3562 байта в 32 блоках

== 28271 == возможно потеряно: 0 байтов в 0 блоках

== 28271 == все еще достижимо: 181 314 байт в 2658 блоках

== 28271 == подавлено: 0 байтов в 0 блоках

Я не понимаю, почему происходят эти утечки. Возможно, я просто не могу прочитать вывод valgrind или правильно использовать инициализацию / финализацию MPI ...

Я использую OMPI 1.4.1-3 под Ubuntu на 64-битной архитектуре, если это может помочь.

Большое спасибо за ваше время!

Ответы [ 2 ]

10 голосов
/ 12 декабря 2011

Вы не делаете ничего плохого. Memcheck ложных срабатываний с valgrind распространены, лучшее, что вы можете сделать, это подавить их.

На этой странице руководства больше говорится об этих ложных срабатываниях. Цитата в конце:

Обертки должны снизить уровень ложных ошибок Memcheck в MPI Приложения. Поскольку упаковка выполняется на интерфейсе MPI, потенциально все еще будет большое количество ошибок, зарегистрированных в MPI реализация под интерфейсом. Лучшее, что вы можете сделать, это попытаться подавить их.

9 голосов
/ 16 декабря 2011

FAQ по OpenMPI устраняет проблемы с valgrind .Это относится к проблемам инициализации и утечкам памяти во время финализации - что не должно иметь практического отрицательного влияния.

Есть много ситуаций, когда Open MPI преднамеренно не инициализирует и впоследствии передает память, например, путем вызова writev.Кроме того, известно несколько случаев, когда память не освобождается должным образом при MPI_Finalize.

Это, безусловно, не помогает отличить реальные ошибки от ложных срабатываний.Valgrind предоставляет функциональные возможности для подавления ошибок и предупреждений из определенных контекстов функций.

В попытке облегчить отладку с использованием Valgrind, начиная с версии 1.5, Open MPI предоставляет так называемый файл подавления Valgrind, который можно передаватьв командной строке:

mpirun -np 2 valgrind
--suppressions=$PREFIX/share/openmpi/openmpi-valgrind.supp
...