Глобальный рабочий массив Fortran против локальных динамически выделяемых массивов

Я работаю со старым кодом F77, который был обновлен до F9X. Он все еще имеет более старую «устаревшую» структуру кода, и мне любопытно узнать об аспекте производительности при добавлении кода устаревшим или современным способом. У нас есть отдельный код F9x, который мы пытаемся интегрировать в этот старый код и использовать как можно больше их процедур вместо того, чтобы переписывать наши собственные версии. Также обратите внимание: предположим, что все эти процедуры НЕ имеют явного интерфейса.

В частности, старый код имеет один большой рабочий массив ранга 1, который выделяется в основной программе, и по мере того, как этот массив передается глубже в процедуры, он разделяется отдельно и используются там, где это необходимо. По сути, существует одно выделение / освобождение, и единственные накладные расходы с этим массивом включают поиск начальных индексов (тривиальных) необходимых временных массивов и передачу этих разделов рабочего массива в процедуру.

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

Я также баловался автоматическими массивами, но остановился, когда начал сталкиваться с проблемами переполнения стека, и теперь почти исключительно использую динамические массивы. Я слышал разные вещи о стеке и куче относительно того, как хранится память для разных типов массивов, но я действительно не знаю разницы и что лучше (производительность, эффективность и т. Д.).

Долгая история Короче говоря, будут ли эти динамически выделяемые (или автоматические) массивы значительно менее эффективными из-за проблем с накладными расходами? Я также понимаю, что динамически выделяемые массивы более устойчивы в течение всего срока службы кода, но на самом деле мне нужна производительность. Увеличение производительности на 5% может означать экономию многих часов при выполнении кода.

Я понимаю, что могу не получить окончательного ответа на этот вопрос из-за различий в оптимизации компилятора и других факторов, но мне любопытно, есть ли у кого-нибудь какие-то знания / опыт ни с чем подобным. Спасибо за вашу помощь.

5
задан Seth 17 June 2011 в 02:49
поделиться