Приводят ли конструкции Fortran 95, такие как WHERE, FORALL и SPREAD, к ускорению параллельного кода? - PullRequest
14 голосов
/ 08 ноября 2010

Я прочитал книгу Фортрана-95 Меткалфа, Рейда и Коэна и Численные рецепты на Фортране-90. Они рекомендуют использовать WHERE, FORALL и SPREAD, чтобы избежать ненужной сериализации вашей программы.

Тем не менее, я наткнулся на этот ответ , в котором утверждается, что FORALL хорош в теории, но на практике бессмысленен - ​​вы могли бы также написать циклы, поскольку они распараллеливаются так же хорошо, и вы можете явно распараллелить их, используя OpenMP (или автоматическийфункциями некоторых компиляторов, таких как Intel).

Может ли кто-нибудь из своего опыта проверить, нашли ли они, как правило, эти конструкции, предлагающие какие-либо преимущества по сравнению с явными циклами и операторами if с точки зрения параллельной производительности?

ИСуществуют ли какие-либо другие параллельные функции языка, которые хороши в принципе, но не стоят его на практике?

Я ценю, что ответы на эти вопросы в некоторой степени зависят от реализации, поэтому меня больше всего интересует gfortran, IntelСПараллелизм ПУ и СМП.

Ответы [ 5 ]

13 голосов
/ 10 ноября 2010

Как я уже сказал в своем ответе на другой вопрос, существует общее убеждение, что FORALL оказался не таким полезным, как можно было ожидать, когда он был введен в язык.Как уже объяснялось в других ответах, у него есть ограничительные требования и ограниченная роль, и компиляторы стали достаточно хорошими в оптимизации регулярных циклов.Компиляторы продолжают улучшаться, а возможности варьируются от компилятора к компилятору.Другая подсказка заключается в том, что Fortran 2008 пытается снова ... помимо добавления явного распараллеливания к языку (уже упоминалось о совместных массивах), существует также «do concurrent», новая форма цикла, которая требует ограничений, которые должны лучше допускать компиляторчтобы выполнить автоматическую оптимизацию параллелизации, но она должна быть достаточно общей, чтобы быть полезной - см. ftp: //ftp.nag.co.uk/sc22wg5/N1701-N1750/N1729.pdf.

Что касается скорости получения, я в основном выбираю хорошие алгоритмы и программы для удобочитаемости и удобства обслуживания.Только если программа работает слишком медленно, я могу найти узкие места и перекодировать или реализовать многопоточность (OpenMP).Это будет редкий случай, когда FORALL или WHERE по сравнению с явным циклом do будут иметь значительную разницу в скорости - я бы больше посмотрел на то, насколько четко они определяют цель программы.

6 голосов
/ 08 ноября 2010

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

У меня нет никаких данных, и если бы я это сделал, они бы устарели. Я действительно должен вытащить все это в набор тестов и попробовать еще раз, компиляторы улучшаются (иногда они тоже ухудшаются).

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

2 голосов
/ 17 марта 2012

FORALL является обобщенным оператором маскированного присваивания (как WHERE). Это не циклическая конструкция.

Компиляторы могут распараллеливать FORALL / WHERE с использованием SIMD-инструкций (SSE2, SSE3 и т. Д.) И очень полезны для получения небольшого уровня параллелизации. Конечно, некоторые более плохие компиляторы не беспокоятся и просто сериализуют код как цикл.

OpenMP и MPI более полезны на более грубом уровне детализации.

0 голосов
/ 10 ноября 2010

* Это должен быть комментарий, а не ответ, но он не помещается в эту маленькую коробочку, поэтому я помещаю его здесь.Не держите это против меня :-) В любом случае, продолжим немного на комментарии @ steabert к его ответу.OpenMP и MPI - это две разные вещи;редко можно выбирать между двумя, поскольку это больше зависит от вашей архитектуры, чем от личного выбора.Что касается изучения концепций паралеллизма, я бы порекомендовал OpenMP каждый день;это проще, и можно легко продолжить переход к MPI позже.

Но это не то, что я хотел сказать.Это - несколько дней назад, Intel объявила, что начала поддерживать Co-Arrays , функцию F2008, ранее поддерживавшуюся только в g95.Они не собираются отказываться от g95, но факт остается фактом: компилятор Intel более широко используется для производственного кода, так что это определенно интересная линия разработки.Они также изменили некоторые вещи в своем компиляторе Visual Fortran (для начала название: -)

Более подробная информация после ссылки: http://software.intel.com/en-us/articles/intel-compilers/

0 голосов
/ 09 ноября 2010

Теоретически, использование таких назначений позволяет компилятору знать, что вы хотите сделать, и должно позволять ему лучше его оптимизировать.На практике посмотрите ответ от Марка ... Я также думаю, что это полезно, если код выглядит чище.Я сам пару раз использовал такие вещи, как FORALL, но не заметил каких-либо изменений производительности по сравнению с обычными DO циклами.

Что касается оптимизации, какой параллелизм вы намерены использовать?Мне очень не нравится OpenMP, но, думаю, если вы решили использовать это, вы должны сначала протестировать эти конструкции.

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