Насколько сложно многопоточность Haskell?
Я слышал, что в Haskell создать многопоточное приложение так же просто, как взять стандартное приложение Haskell и скомпилировать его с помощью -threaded флаг. Другие случаи, однако, описали использование в исходном коде.
каково состояние многопоточности Haskell? Насколько легко это ввести в программы? Есть ли хороший многопоточный учебник, который проходит через эти различные команды и их использование?
2 ответов:
каково состояние многопоточности Haskell?
зрелые. Реализация составляет около 15 лет, с транзакционной памятью в течение 5 лет. GHC-это широко используемый компилятор с большой поддержкой открытого исходного кода и коммерческой поддержкой.
как легко это ввести в программы?
Это зависит от алгоритма. Иногда это может быть одна строка использования
parдля усиления параллелизма. Иногда новые алгоритмы должны быть развитый. В целом в Haskell будет легче внедрить безопасный параллелизм и параллелизм, чем в типичных языках, и производительность хорошая.есть ли хороший многопоточный учебник, который проходит через эти различные команды и их использование?
есть 3 основных параллельных и параллельных моделей программирования в Haskell.
- неявный параллелизм через
par- явный параллелизм и параллелизм через forkIO / MVars и программная транзакционная память
- параллелизм данных через библиотеки DPH
Это главные вещи. Во всех случаях вы компилируете с-threaded для использования многоядерной среды выполнения, но насколько легко распараллелить конкретную проблему, зависит от используемого алгоритма и модели параллельного программирования, которую вы принимаете из этого списка.
здесь введение в основные модели параллельного программирования в Haskell, а как же для достижения ускорения.
Я думаю Глава 24 реального мира Хаскелл хороший учебник.
существует также термин параллелизма.
без каких-либо изменений в коде ваш haskell rts будет пытаться использовать их для какого-то внутреннего процесса, но для использования в вашем приложении вы должны дать подсказку, что сделано
par b (f a b)который заставляет Хаскелла быть не столь ленивым на caculation ofbдаже еслиfне приведет к желаемому результату.одна из причин не делать этого для каждой функции, которая требует всех своих аргументов (например,
a+b) является то, что синхронизация (планирование вычислений и ожидание результатов) дает некоторые накладные расходы, и вы, вероятно, не хотите тратить дополнительные тики для(2*3)+(3*4)просто потому что вы можете рассчитать умножения параллельно. И вы, вероятно, потеряете некоторые кэш-хиты или что-то вроде этого или оптимизации, которые выполняются, когда вы делаете это на одном процессоре (т. е. вам все равно нужно будет передать результат от одного процессора к другому).конечно, код, который использует
parуродливо и когда вы складываете список или какой-то другой структуры данных с легкими подэлементами вы, вероятно, захотите вычислить некоторые фрагменты этих легких элементов, чтобы убедиться, что накладные расходы/calc будут действительно небольшими. Чтобы решить, что вы можете посмотреть параллельно.есть также данные параллельного Haskell (DPH).
если ваша программа больше о монаде IO, чем вам определенно нужно много изменений. Смотрите
forkIO,программная транзакционная память (STM) и многие другие из параллелизм категории
Comments