Легкие потоки Haskell накладные расходы и использование на многоядерных - PullRequest
58 голосов
/ 01 мая 2011

Я читал книгу "Real World Haskell", главу о параллелизме и параллелизме.Мой вопрос заключается в следующем:

  • Поскольку потоки Haskell на самом деле представляют собой просто несколько «виртуальных» потоков внутри одного «реального» потока ОС, означает ли это, что их создается много (например, 1000) не окажет кардинального влияния на производительность?То есть, можем ли мы сказать, что издержки, возникающие при создании потока на Haskell с forkIO, (почти) незначительны?Пожалуйста, приведите практические примеры, если это возможно.

  • Разве концепция легких потоков не мешает нам использовать преимущества многоядерных архитектур?Как я понимаю, два потока Haskell не могут выполняться одновременно на двух отдельных ядрах, потому что с точки зрения операционной системы это действительно один поток.Или среда выполнения Haskell делает некоторые хитрые трюки, чтобы гарантировать возможность использования нескольких процессоров?

Ответы [ 3 ]

85 голосов
/ 01 мая 2011

Среда выполнения GHC обеспечивает среду исполнения, поддерживающую миллиарды искр, тысячи легких потоков, которые могут быть распределены по нескольким аппаратным ядрам. Скомпилируйте с -threaded и используйте флаги +RTS -N4, чтобы установить желаемое количество ядер.

sparks/threads/workers/cores

В частности:

означает ли это, что их создание (например, 1000) не окажет существенного влияния на производительность?

Ну, создание 1 000 000 из них , безусловно, возможно. 1000 так дешево, что даже не появится. В тестах создания потоков, таких как "thread thread", вы можете видеть, что GHC очень, очень хорош .

Не мешает ли концепция облегченных потоков использовать преимущества многоядерных архитектур?

Совсем нет. GHC работает на многоядерных системах с 2004 года. Текущее состояние многоядерной среды выполнения отслеживается здесь .

Как это сделать? Лучшее место для изучения этой архитектуры - статья «Поддержка времени выполнения для Multicore Haskell» :

Система выполнения GHC поддерживает миллионы легких потоков путем мультиплексирования их в несколько потоков операционной системы, примерно по одному на каждый физический процессор. ...

Потоки на Haskell выполняются операционной системой темы, которые мы называем рабочими потоками. Мы поддерживаем примерно один рабочий поток на физический процессор, но какой именно рабочий поток может меняться от момента к моменту ...

Поскольку рабочий поток может измениться, мы поддерживаем ровно один Контекст выполнения Haskell (HEC) для каждого процессора. HEC является структура данных, которая содержит все данные, которые рабочий поток ОС требуется для выполнения потоков на Haskell

Вы можете следить за тем, как создаются и где выполняются ваши потоки, через нить. . Здесь, например, запуск теста бинарных деревьев:

threadscope

14 голосов
/ 01 мая 2011
  • Веб-сервер Warp широко использует эти легкие потоки для получения действительно хорошей производительности . Обратите внимание, что другие веб-серверы на Haskell также порождают конкуренцию: это скорее «Haskell хорош», чем «Warp is good».

  • Haskell предоставляет многопоточную среду выполнения, которая может распределять легкие потоки по нескольким системным потокам. Он работает очень хорошо до 4 ядер. После этого есть некоторые проблемы с производительностью, хотя над ними активно ведутся работы.

4 голосов
/ 01 мая 2011

Создание 1000 процессов относительно легкий вес;не беспокойся об этом.Что касается производительности, вы должны просто оценить ее.

Как было указано ранее, несколько ядер работают просто отлично.Несколько потоков Haskell могут работать одновременно, будучи запланированными в разных потоках ОС.

...