Насколько сложно многопоточность Haskell?



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



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

647   2  

2 ответов:

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

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

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

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

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

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

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

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

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

Я думаю Глава 24 реального мира Хаскелл хороший учебник.

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

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

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

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

есть также данные параллельного Haskell (DPH).

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

Comments

    Ничего не найдено.