Как я могу найти причину утечки памяти в программе на Fortran 2003? - PullRequest
1 голос
/ 17 марта 2012

У меня есть программа на Фортране, которую я написал с использованием Fotran 2003 и скомпилировал с использованием

Intel® Fortran Compiler XE для приложений, работающих на IA-32, версия 12.1.2.273, сборка 20111128

после долгого запуска моей программы (это физическое вычисление) я прочитал:
Недостаточно памяти для выделения буфера сообщений Fortran RTL, сообщение

Я догадался, что это связано с утечкой памяти в моей программе Как я могу узнать, где происходит утечка и как ее исправить?

Ответы [ 3 ]

6 голосов
/ 17 марта 2012

Как показывает первый ответ, ваш вопрос носит очень общий характер и не может быть изменен в зависимости от конкретного ответа. Вы используете указатели? Указатели менее безопасны, чем размещаемые - переключайтесь на размещаемые, если они будут выполнять эту работу.

Предложение по параметрам отладки для ifort: -O2 -stand f03 -assume realloc_lhs -check all -traceback -warn all -fstack-protector -assume protect_parens -implicitnone

2 голосов
/ 17 марта 2012

Это скорее расширенный комментарий, чем ответ ...

Вы догадались, что у вас утечка памяти, но вы не предоставили нам никакой информации, с помощью которой мы можем помочь вам превратить ваши предположения в диагноз. При отсутствии такой информации, некоторые советы ...

a) утечки памяти в программах на Фортране происходят так же, как и в других программах: программисты забывают (или пренебрегают) освобождать переменные по окончании; не забывайте, что с Fortran 2003 вы можете иметь выделяемые скаляры;

b) в длительных научных вычислениях нет ничего необычного в том, что большие массивы выходов создаются итеративно, иногда лучше записать их на диск во время вычислений, чем ждать до конца; вы получаете удар по времени ввода-вывода (ну, в основном, O), но экономите на использовании памяти;

c) существует множество инструментов, помогающих обнаружить утечки памяти, включая Intel Inspector и различные программы с открытым исходным кодом;

d) вы должны хорошо понимать, как изменяется память, требуемая вашей программой при ее запуске;

д) и иногда, в этом домене, ответ просто купить больше ОЗУ.

1 голос
/ 27 марта 2012

Полагаю, вы уже получили ответ от компилятора: недостаточно памяти.В какой-то момент вашей программы вы пытаетесь выделить большую память.

Вы можете скомпилировать вашу программу с флагами "-O0 -debug -traceback -check -ftrapuv" и запустить ее снова.Вы можете использовать отладчик Intel для построчного просмотра программы (я имею в виду, где, по вашему мнению, может быть проблема).Если повезет, вам не понадобятся другие инструменты, такие как valgrind.

Иногда компиляция с помощью Gfortran также поможет.Обратите внимание, что вам нужно использовать разные параметры компилятора для проверки границ массива.

Последний совет будет касаться использования конструкции «ассоциировать».У меня лично было много проблем с его использованием.Если вы используете его, удалите его из кода и проверьте еще раз.

...