Насколько трудный многопоточность Haskell?

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

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

62
задан ony 10 June 2010 в 06:44
поделиться

2 ответа

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

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

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

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

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

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

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

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

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

Я думаю Глава 24 Real World Haskell - хорошее руководство.

66
ответ дан 24 November 2019 в 16:51
поделиться

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

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

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

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

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

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

18
ответ дан 24 November 2019 в 16:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: