Вопросы

fortran 2003 и указатели

Я пишу программу на Фортране. В программе реализованы некоторые численные методы. Скорость программы очень важна. Я решил избавиться от динамических массивов (ускоряет ли это программу?) И столкнулся со следующей проблемой. У меня есть трехмерные массивы (элементы NXxNYxNZ = MAX), где я знаю MAX, но я не знаю соотношение NX / NY / NZ. Это может быть так: 1x1xNZ или как это 2xNYx1 и т. Д. Решение, которое я вижу — использовать указатели. Упрощенный 2D-случай:

program ptrtest
   parameter ( MAX = 50 )    ! I know this number on compile time.
   integer :: NX,NY          ! I will find this numbers on run time.
   real, target :: a(MAX)    ! Static Array
   real, pointer :: b(:,:)
   a = 5
   read(*,*) NX, NY          ! I get NX, NY (NX*NY == MAX)
   b (1:NX, 1:NY) => a       ! I can use b(:,:) <- this is my goal.
end program ptrtest

Этот пример работает, но я боюсь, что такое обновление замедлит работу реальной программы, в которой я использую даже 5d массивы. Является ли это возможным?

Вы не показываете достаточно программы, чтобы по-настоящему комментировать (Вы работаете с a и b одновременно? Вы сразу передаете b в подпрограмму?), Но в целом производительность будет хуже при работе с переменными, которые имеют TARGET или POINTER, потому что некоторые оптимизации могут быть предотвращены. Это будет зависеть от специфики, но выделение выделяемого массива размера (nx, ny) один раз вряд ли будет таким значительным падением производительности по сравнению с чем-то вроде оператора READ, который заполняет nx и ny.   —  person Vasiliy    schedule 18.12.2014

Читать:
Как правильно выполнить приведение для сравнения указателя с явным диапазоном адресов?

Если вам нужен массив с размерами, определяемыми во время выполнения, я рекомендую использовать выделяемый массив, а не массив указателей, если вам также не нужна дополнительная функция указателя. размещаемые объекты безопаснее. Кроме того, лучше всего решить вашу проблему, а затем определить медленные части, а не гадать с самого начала. Микрооптимизации редко имеют большое значение. Выбор эффективного алгоритма важен.   —  person Vasiliy    schedule 18.12.2014

FWIW Я согласен с другими комментаторами. Но если вы знаете MAX во время компиляции, но не знаете, до времени выполнения _2 _, _ 3_ и nz, вы всегда можете использовать проверенный (для которого понимается «старомодный») подход использования одномерного массива ( из MAX элементов) и арифметические операции с собственным индексом. Если вы рассматриваете этот подход, внимательно изучите наблюдения @ M.S.B. по оптимизации.   —  person Vasiliy    schedule 18.12.2014

Похожие записи

Луч — Прочтите AVRO и преобразуйте

admin

Тупик в диапазоне по каналу в конвейере с несколькими группами ожидания

admin

Что вам даст перестановка указателя при сборке мусора?

admin

В Flutter Web возникает ошибка XMLHttpRequest при выполнении вызова WCF https

admin

Матрица умножения размеров сбивает с толку

admin

Общие сведения о передаче исходящих данных для плана службы приложений Azure

admin