2012-02-02 3 views
2

Я пытаюсь понять, что на самом деле происходит, когда вы хотите использовать более одного ядра в Haskell. This дает хорошее введение, но IMHO не очень критично и оставляет много вопросов открытым.Haskell и Multicore, что действительно происходит

Когда я использую парный комбинатор или forkIO в своем коде и компилирую его с флагом -threaded, что в конечном итоге решает, получаю ли я поток ОС или нет? Это компилятор или ОС?

Если я использую forkOS, который всегда должен создавать поток ОС, освобождает ли я меня от возможностей базовой ОС?

Чтобы уточнить мой вопрос: Я предполагаю, что в многоядерном мире базовая/установленная ОС имеет ограничения в отношении того, сколько ядер она может иметь смысл и использовать. Все, что я делаю в Haskell, урезано возможностями ОС? Или, есть ли какие-либо способы (что они?), Чтобы быть лучше, чем ОС, в некотором смысле, что если у хоста есть 12 ядер и мастеров OS 8, могу ли я нажать это дальше, написав смарт-приложения в Haskell или тогда все, что я запускаю на этом хосте с этой ОС, ограничено умным использованием 8 ядер?

+1

Если ОС говорит, что вы не имеют более восьми ядер, вы фактически не имеют более восемь ядер. –

+0

@ Daniel Fischer OS сообщает мне, какие ядра там, что не обязательно означает, что они могут понять их/использовать их все, не так ли? –

+0

Не обязательно, это правда. Но если вы бежите на голом металле, ограничения ОС - это жесткие ограничения для вас. До сих пор я не слышал о реализации Haskell на голом металле. К счастью, современная ОС может осмыслить все ядра, которые вы, скорее всего, будете иметь в ближайшем будущем. –

ответ

10

Время выполнения Haskell определяет, сколько потоков ОС необходимо создать. ОС решает, как сопоставить эти потоки с физическими ядрами и процессорами. Компилятор действительно не имеет к этому никакого отношения, Я думаю ...

Здесь есть несколько слоев. (Обратите внимание, что компилятор не в этой схеме.)

 
+-----------------+ 
| User code | 
+-----------------+ 
     | 
     | forkIO creates 
     v 
+-----------------+ 
| Haskell threads | 
+-----------------+ 
     | 
     | Runtime library maps to 
     v 
+-----------------+ 
| OS Threads | 
+-----------------+ 
     | 
     | OS scheduler runs on 
     v 
+-----------------+ 
| Physical cores | 
+-----------------+ 

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

Библиотека времени выполнения выбирает, сколько потоков ОС создано, а также какие части вашего кода запускаются в каком потоке. У вас есть контроль над ним, но одна из его функций - сопоставить ваш код с потоками ОС.

Как вы можете видеть, если ОС ограничена использованием 8 ядер, то вы не можете использовать 12. Вы не можете обойти ограничения ОС. Однако современные ОС поддерживают больше ядер, чем у вас, поэтому не беспокойтесь. (Если вы используете Windows XP, вы застряли с 2-мя ядрами. Но это глупо запускать Windows XP на компьютере с более чем 2-х ядер.)

+0

Итак, на 100-ядерной системе ОС запустит 100 нитей, которые будут «ничего», пока библиотека времени выполнения не появится вместе с моими потоками Haskell? –

+6

Прочтите еще раз. «** ОС никогда не создаст для вас поток ОС **, это не работа». –

2
  1. получить четыре потока ОС вы бы использовать опция + RTS -N4 -RTS в командной строке при запуске программы. Чтобы получить другое число, равное 4, вы просто замените его. По умолчанию (не-threaded runtime) вы получите только один поток ОС, хотя вы можете запускать в нем много потоков IO с низким коэффициентом заполнения GHC. С помощью -N4 среда выполнения запускает 4 тотальных потока при запуске программы, а затем к ним передаются потоки ввода-вывода.

  2. Да, вы можете напрямую запустить поток ОС с помощью forkOS. Причина, по которой вы, возможно, захотите это сделать, - это вызывать функцию C через FFI, которая может использовать блокирующие операции ввода-вывода и будет заморожать другие легкие потоки, если она работает в тех же потоках ОС. В противном случае пусть среда выполнения обрабатывает потоки ОС.

  3. Вы, вероятно, следует прочитать Haskell параллелизм связанные статьи начиная здесь:

Смежные вопросы