Fortran Forall ограничения - PullRequest
       26

Fortran Forall ограничения

7 голосов
/ 22 декабря 2011

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

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

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

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

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

Ответы [ 2 ]

12 голосов
/ 22 декабря 2011

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

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

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

6 голосов
/ 22 декабря 2011
Конструкция

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...