2014-09-28 4 views
1

В haskell, данный у меня есть функция вызвать в следующей форме: foo a b, где a не зависит от b и наоборот. Кажется, что можно автоматически обнаружить, что a и b могут быть оценены параллельно, но это, похоже, не имеет места в GHC. Вместо этого строятся как par, которые необходимо использовать для обозначения того, что можно оценить параллельно.Автоматический параллелизм в Haskell

Итак, почему не может произойти автоматическое распараллеливание в haskell? Или, если это уже сделано, зачем существуют конструкции вроде par?

+3

Проблема с автоматическим параллелизмом заключается в том, что она добавляет накладные расходы, и очень сложно автоматически определить, приносит ли польза или нет параллельная оценка двух выражений. –

+0

См. Также [Data Parallel Haskell] (http://www.haskell.org/haskellwiki/GHC/Data_Parallel_Haskell). –

+0

@ PetrPudlák Итак, проблема не в том, что принцип не работает, но что он не такой большой выигрыш или даже может стать медленнее? – Kritzefitz

ответ

3

кажется, что он может быть автоматически обнаружено, что б можно оценить параллельно

параллелизм может определяться автоматически, как вы намекнуть, глядя на зависимости между величинами. Это особенно легко, если нет побочных эффектов.

Проблема в том, что это знание, когда нужно прекратить делать вещи параллельными.

Все это сводится к пониманию во время компиляции, сколько работы будет происходить во время выполнения. Эти «стоимостные модели» вообще сложно сделать для произвольного кода.

Рассмотрим:

  • должен каждый аргумент (+) быть оценены параллельно?
  • Следует ли оценивать каждую карту параллельно?

Если мы наивно распараллеливаем все независимые вычисления, компилятор будет генерировать огромное количество параллельных задач. Миллионы или миллиарды параллельных выражений. Какие наши 8 или 16-ядерные машины просто не готовы к работе.

Наивное распараллеливание приводит к массивным накладным расходам, которые пытаются запланировать работу на небольшом количестве доступного параллельного оборудования.

Этот пробел между количеством параллелизма в чистых программах и доступным оборудованием заставляет нас пойти на компромиссы. А именно:

  1. пользователь аннотированных намеков на какие вещи являются достаточно дорогостоящими, чтобы сделать в параллельных
  2. подмножеств языка, которые имеют четкую модель затрат, так что компилятор может быть умным.

Примеры первой формы - пользовательские подсказки - are par annotations или Par monad. Из вторых - автоматически параллельных подязыков - см. Data Parallel Haskell.

+0

Этот ответ * предполагает *, что (а) существует очень наивная среда выполнения, нерегулярные задачи и/или (б) во время компиляции должно быть известно, сколько должно быть введено параллелизм где. Он не указывает, что автоматический параллелизм (в Haskell) является просто нерешенной проблемой, а не неразрешимой *. (a) Почему не может, например, (фиксированный пул) рабочих потоков определяют себя, где они могут идти, и выполнять некоторую работу на основе стека времени выполнения существующих потоков? (b) Почему это должно быть известно во время компиляции, когда должно происходить распараллеливание? – masterxilo

+0

Я не понимаю, почему мы не могли, например. напишите в C/C++ функциональную (побочный эффект и состояние бесплатно) функцию типа Haskell и просто используйте, например. [Cilk] (https://en.wikipedia.org/wiki/Cilk) слепые 'spawn' и' sync' слепо на каждом вызове подфункции ('a' и' b' в примере 'foo ab'), а затем 'sync' перед вычислением' foo a 'b'' результатов. Ключевые слова - это простые подсказки, и среда выполнения игнорирует их, если все рабочие потоки уже заняты. Кажется идеальным решением ... – masterxilo

Смежные вопросы