Я услышал, что в Haskell, создавая многопоточное приложение так же легко как взятие стандарта приложение Haskell и компиляция его с -threaded
флаг. Другие случаи, однако, описали использование a par
команда в фактическом исходном коде.
Каково состояние многопоточности Haskell? Как легкий это должно ввести в программы? Существует ли хорошее учебное руководство многопоточности, которое пробегается через эти различные команды и их использование?
Каково состояние многопоточности Haskell?
Зрелая. Реализации около 15 лет, с транзакционной памятью на 5 лет. GHC - широко используемый компилятор с большой поддержкой открытого исходного кода и коммерческой поддержкой.
Насколько легко это внедрить в программы?
Это зависит от алгоритма. Иногда для достижения параллелизма можно использовать одну строку par
. Иногда необходимо разрабатывать новые алгоритмы. В целом в Haskell будет проще внедрить безопасный параллелизм и параллелизм, чем в типичных языках, и производительность будет хорошей.
Есть ли хороший учебник по многопоточности, в котором рассматриваются эти различные команды и их использование?
В Haskell есть 3 основные модели параллельного и параллельного программирования.
par
Это основные вещи. Во всех случаях вы компилируете с -threaded для использования многоядерной среды выполнения, но насколько легко распараллелить конкретную проблему, зависит от используемого алгоритма и модели параллельного программирования, которую вы выбираете из этого списка.
Вот введение в основные модели параллельного программирования в Haskell, и способы достижения ускорения.
Я думаю Глава 24 Real World Haskell - хорошее руководство.
Существует также термин параллелизм.
Без каких-либо изменений в коде ваш haskell rts будет пытаться использовать их для какого-то внутреннего процесса, но для использования в вашем приложении вы должны дать подсказку, сделанную par b (fab)
, которая заставит Haskell не поленитесь вычислить b
, даже если f
не потребует его для результата.
Одна из причин не делать это для каждой функции, требующей всех ее аргументов (например, a + b
), заключается в том, что синхронизация (планирование вычислений и ожидание результатов) дает некоторые накладные расходы, и вы, вероятно, не Не хочу тратить лишние тики на (2 * 3) + (3 * 4)
только потому, что вы можете вычислять умножения параллельно. И вы, вероятно, потеряете некоторые попадания в кеш или что-то в этом роде или оптимизацию, которая будет сделана, когда вы сделаете это на одном процессоре (т.е. вам все равно нужно будет передать результат от одного процессора к другому).
Конечно, код, который использует par
, уродлив, и когда вы сворачиваете список или некоторые другие структуры данных со светлыми подэлементами, вы, вероятно, захотите вычислить некоторые фрагменты этих светлых элементов, чтобы убедиться, что накладные расходы / вычисление будут действительно маленькими. Чтобы решить эту проблему, вы можете посмотреть параллельно .
Существует также Data Parallel Haskell (DPH).
Если ваша программа больше связана с монадой ввода-вывода, вам определенно нужно много изменений. См. forkIO
, Программная транзакционная память (STM) и многие другие из категории параллелизма