2012-03-17 5 views
1

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

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

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

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

ответ

5

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

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

+0

Если я использую указатель и перенаправляю его на другой объект, я должен освободить объект-сирота после повторного назначения, правильно? –

+1

Вы должны освободить объект, когда он вам больше не нужен. Вам нужно сделать это, пока вы все еще имеете действительный способ ссылаться на него. Если ваш единственный способ - через указатель, и вы переназначите указатель, чем у вас просочилась память. Труднее иметь утечки с выделяемыми переменными, потому что, в отличие от указателей, они во многих случаях автоматически освобождаются. Например, выделяемые переменные, локальные для процедуры, автоматически освобождаются при выходе из процедуры. –

2

Это более протяженного комментарий, чем ответ ...

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

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

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

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

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

e) и иногда в этой области ответ заключается только в том, чтобы купить больше оперативной памяти.

+0

Это большая программа, я хочу спросить больше о методах, которые я могу использовать для диагностики проблемы. Возможно, что-то вроде mem debugger –

+6

Если вам нужен инструмент, а не попытка valgrind. –

+0

+1 для valgrind (http://valgrind.org/) – alexurba

1

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

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

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

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

+0

У меня также было несколько проблем с конструкцией 'associate'. –