В исследовательской работе 2005 года было сказано
Concurrent Haskell в настоящее время реализован только для однопроцессорного процессора. Среда выполнения планирует легкий поток Haskell в пределах одного потока операционной системы. Нити Хаскелла подвешены только в четко определенных «безопасных точках»; их нельзя превалировать в произвольные моменты.
Изменилось ли это или Concurrent Haskell по-прежнему ограничен одним потоком ОС?
GHC может использовать многоядерные процессоры для параллельного и параллельного Haskell с 2004 года . Concurrent, Parallel, Nested Data Parallel Haskell использует одну и ту же многопоточную среду выполнения.
[править: в вопросе упоминается только Concurrent Haskell, но я полагаю, что упоминаемая статья - это «Транзакции составной памяти», в которой впервые был описан Haskell STM. Пожалуйста, поправьте меня, если я ошибаюсь.]
STM теперь отлично работает на нескольких ядрах. Параллельная реализация была впервые представлена в GHC 6.6 и использует детальную стратегию двухфазной блокировки; то есть, чтобы зафиксировать транзакцию, реализация сначала пытается заблокировать каждую переменную, участвующую в транзакции, затем фиксирует изменения и, наконец, разблокирует все переменные. Получение блокировки не блокирует: если блокировка уже удерживается, транзакция прерывается и повторяется (это позволяет избежать обычной тупиковой ситуации с изменением порядка блокировки, которая применяется, если получение блокировки было блокирующим).
Эта реализация STM, безусловно, не самая быстрая - в литературе описывается множество альтернативных методов, которые могут привести к повышению производительности, но реализация GHC относительно проста и не включает каких-либо глобальных блокировок (транзакции, работающие с отдельными наборами переменных, могут выполняться в параллельно без помех).
GHC Haskell хорошо работает на многоядерных системах
Программы GHC Haskell с 2004 года запускают несколько потоков Haskell через несколько потоков ОС, которые распределены по нескольким ядрам.
Кроме того, вы можете получить последний статус многоядерного Haskell из этого вопроса SO.