Насколько сложна многопоточность на Haskell? - PullRequest
61 голосов
/ 10 июня 2010

Я слышал, что в Haskell создать многопоточное приложение так же просто, как взять стандартное приложение на Haskell и скомпилировать его с флагом -threaded.В других случаях, однако, описано использование команды par в фактическом исходном коде.

Каково состояние многопоточности Haskell?Насколько легко внедрить в программы?Есть ли хороший учебник по многопоточности, в котором рассматриваются эти различные команды и их использование?

Ответы [ 2 ]

65 голосов
/ 10 июня 2010

Каково состояние многопоточности Haskell?

Зрелые.Реализации около 15 лет, с транзакционной памятью на 5 лет.GHC - широко используемый компилятор, с большой поддержкой открытого исходного кода и коммерческой поддержкой.

Насколько легко вводить в программы?

Это зависит от алгоритма.Иногда это может быть использование одной строки par для получения параллелизма.Иногда новые алгоритмы должны быть разработаны.В целом, будет проще внедрить безопасный параллелизм и параллелизм в Haskell, чем в типичных языках, и производительность будет хорошей.

Есть ли хорошее учебное пособие по многопоточности, которое рассматривает эти различные команды и ихиспользует?

В Haskell существует 3 основных модели параллельного и параллельного программирования.

  • неявный параллелизм через par
  • явный параллелизм и параллелизм через forkIO/ MVars и программная транзакционная память
  • параллелизм данных через библиотеки DPH

Это основные вещи.Во всех случаях вы компилируете с -threaded для использования многоядерной среды выполнения, но насколько легко распараллелить конкретную проблему, зависит от используемого вами алгоритма и модели параллельного программирования, которую вы выбираете из этого списка.

Здесь введение в основные модели параллельного программирования в Haskell, и способы достижения ускорений.

Я думаю Глава 24 из Real World Haskell - хороший учебник.

18 голосов
/ 10 июня 2010

Существует также термин параллелизма.

Без каких-либо изменений в коде ваш haskell rts попытается использовать их для какого-то внутреннего процесса, но для использования в вашем приложении вы должны дать подсказку, сделанную par b (f a b)что заставляет Haskell не слишком лениться при вычислении b, даже если f не потребует его для результата.

Одна из причин не делать этого для каждой функции, которая требует всех своих аргументов (как a+b), синхронизация (планирование вычислений и ожидание результатов) дает некоторые накладные расходы, и вы, вероятно, не хотите тратить дополнительные тики на (2*3)+(3*4) только потому, что вы можете вычислять умножения параллельно.И вы, вероятно, потеряете некоторые попадания в кеш или что-то вроде этого или оптимизации, которые выполняются, когда вы делаете это на одном процессоре (то есть вам все равно придется передавать результат с одного процессора на другой).

Конечнокод, который использует par, уродлив, и когда вы сворачиваете список или некоторые другие структуры данных с легкими подэлементами, вы, вероятно, захотите вычислить некоторые куски этих легких элементов, чтобы убедиться, что накладные расходы / calc будут действительно небольшими.Чтобы решить эту проблему, вы можете посмотреть на параллельный .

. Существует также Data Parallel Haskell (DPH).

Если ваша программа больше связана с монадой ввода-вывода, чем вам определенно нужно многоизменения.См. forkIO, Программная транзакционная память (STM) и многие другие из Категория параллелизма

...