Ограничения Fortran forall

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

какие другие функции/операции, не разрешенной forall заблокировать?

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

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

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

2 ответов


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

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

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


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