Ответ 1
Время выполнения GHC обеспечивает среду выполнения, поддерживающую миллиарды искр, тысячи легких потоков, которые могут быть распределены по нескольким ядерным ядрам. Скомпилируйте с помощью -threaded
и используйте флаги +RTS -N4
, чтобы установить необходимое количество ядер.
В частности:
означает ли это, что создание многих из них (например, 1000) не окажет существенного влияния на производительность?
Ну, создание 1 000 000 из них, безусловно, возможно. 1000 так дешево, что он даже не появится. Вы можете увидеть в тестах создания потоков, таких как "кольцо нитей", которое GHC очень, очень хорошо.
Разве концепция легких потоков не позволяет нам использовать преимущества многоядерных архитектур?
Совсем нет. GHC работает с multicores с 2004 года. Текущий статус многоядерной версии отслеживается здесь.
Как это делается? Лучшее место для чтения по этой архитектуре содержится в документе "Поддержка времени выполнения для многоядерного Haskell" :
Система времени выполнения GHC поддерживает миллионы легких потоков путем мультиплексирования их на несколько потоков операционной системы, примерно один для каждого физического процессора....
Потоки Haskell выполняются набором операционных систем потоков, которые мы называем рабочими потоками. Мы поддерживаем примерно один рабочий поток на физический процессор, но именно тот рабочий поток может меняться от момента к моменту...
Поскольку рабочий поток может меняться, мы поддерживаем ровно один Контекст исполнения Haskell (HEC) для каждого CPU. HEC - это структура данных, которая содержит все данные, которые рабочий поток ОС требуется для выполнения потоков Haskell
Вы можете следить за тем, как создаются ваши потоки и где они выполняются, через threadcope.. Здесь, например, запуск теста бинарных деревьев: