Ограничения 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.