Среда выполнения GHC обеспечивает среду исполнения, поддерживающую миллиарды искр, тысячи легких потоков, которые могут быть распределены по нескольким аппаратным ядрам. Скомпилируйте с -threaded
и используйте флаги +RTS -N4
, чтобы установить желаемое количество ядер.
![sparks/threads/workers/cores](https://i.stack.imgur.com/u53Uk.png)
В частности:
означает ли это, что их создание (например, 1000) не окажет существенного влияния на производительность?
Ну, создание 1 000 000 из них , безусловно, возможно. 1000 так дешево, что даже не появится. В тестах создания потоков, таких как "thread thread", вы можете видеть, что GHC очень, очень хорош .
Не мешает ли концепция облегченных потоков использовать преимущества многоядерных архитектур?
Совсем нет. GHC работает на многоядерных системах с 2004 года. Текущее состояние многоядерной среды выполнения отслеживается здесь .
Как это сделать? Лучшее место для изучения этой архитектуры - статья «Поддержка времени выполнения для Multicore Haskell» :
Система выполнения GHC поддерживает миллионы легких потоков
путем мультиплексирования их в несколько потоков операционной системы,
примерно по одному на каждый физический процессор. ...
Потоки на Haskell выполняются операционной системой
темы, которые мы называем рабочими потоками. Мы поддерживаем примерно один
рабочий поток на физический процессор, но какой именно рабочий поток
может меняться от момента к моменту ...
Поскольку рабочий поток может измениться, мы поддерживаем ровно один
Контекст выполнения Haskell (HEC) для каждого процессора. HEC является
структура данных, которая содержит все данные, которые рабочий поток ОС
требуется для выполнения потоков на Haskell
Вы можете следить за тем, как создаются и где выполняются ваши потоки, через нить. . Здесь, например, запуск теста бинарных деревьев:
![threadscope](https://i.stack.imgur.com/t82yH.png)