Фортран для всех ограничений

Я пробовал использовать forall для размещения динамических массивов, но gfortran это не понравилось. Я также обнаружил, что write операторы запрещены в блоке forall, и я подозреваю, что read операторы тоже.

Какие другие функции / операции не разрешены в блоке forall?

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

Каковы причины этих ограничений, т.е. что они защищают / предотвращают от ошибок пользователя? Это хорошая идея использовать forall? Если да, то для каких целей?

Прямо сейчас в коде, над которым я работаю, есть только один блок forall, и если я переведу все это в do циклы, это даст четыре вложенных цикла. Какой способ лучше?


person Samuel Tan    schedule 22.12.2011    source источник


Ответы (2)


В настоящее время нет особой необходимости в конструкциях FORALL и WHERE. Они были введены как часть Fortran 95 (незначительное расширение Fortran 90), в основном с целью оптимизации, когда векторизация кода была основным делом в HPC. Причина того, что FORALL настолько ограничена в применении, как раз потому, что она была разработана для оптимизации цикла. Также обратите внимание, что FORALL - это не конструкция цикла, а присваивание. Таким образом, внутри блока разрешены только операторы присваивания. Теоретически DO циклы дают явные инструкции о порядке индексов, которые процессор будет перебирать. Конструкция FORALL позволяет компилятору выбрать наиболее оптимальный порядок в зависимости от того, как массив хранится в памяти. Однако со временем это потеряло смысл, так как современные компиляторы очень хороши в DO векторизации циклов, и вы вряд ли заметите какие-либо улучшения при использовании FORALL.

См. Интересное обсуждение FORALL и WHERE здесь

Если вас беспокоит производительность кода, лучше подумайте о другом компиляторе - PGI или ifort. По моему собственному опыту, gfortran подходит для разработки, но не совсем для HPC. Вы заметите, что выполнение кода, скомпилированного с помощью pgf90 или ifort, в несколько раз быстрее.

person milancurcic    schedule 22.12.2011

Конструкция Forall оказалась слишком строгой и в основном полезна только для операций с массивами. Точные ограничения см. На странице IBM Фортран - FORALL. Менее строгим является do concurrent конструкция Fortran 2008. Здесь разрешены даже инструкции read и write. См. Intel Fortran - DO CONCURRENT и Новые возможности Fortran 2008.

person Vladimir F    schedule 22.12.2011
comment
Однако пока еще не многие компиляторы поддерживают Fortran 2008. Я использую gfortran, последнюю стабильную версию (4.6?) - person Samuel Tan; 22.12.2011
comment
Gfortran 4.6 частично поддерживает его fortranwiki.org/fortran/show/Fortran+2008+status и gcc.gnu.org/onlinedocs/gfortran/Fortran -2008-status.html, в котором заявлена ​​поддержка do concurrent в новейшем gfortran. - person Vladimir F; 22.12.2011