Почему вы должны использовать как флаг компилятора, так и флаг времени выполнения, чтобы получить поддержку многоядерности в Haskell? - PullRequest
19 голосов
/ 14 сентября 2010

Вики Haskell показывает, что вам нужно установить флаг компиляции и флаг времени выполнения, чтобы получить поддержку многоядерности.Почему недостаточно использовать библиотеку, чтобы получить правильное поведение во время компиляции?Почему исполняемый файл во время выполнения не может обнаружить, что он был скомпилирован с помощью -threaded, и использовать все ядра в системе, если не указано иное?Я думаю, что включить их по умолчанию было бы лучше.Тогда могут быть флаги, чтобы отключить или изменить эти функции.

http://www.haskell.org/haskellwiki/GHC/Concurrency#Multicore_GHC говорит:

Скомпилируйте вашу программу, используя ключ -threaded. Запустите программу с + RTS -N2, чтобы использовать, например, 2 потока.Вы должны использовать значение -N, равное количеству ядер ЦП на вашем компьютере (не включая ядра с гиперпоточностью).


Кажется несколько обременительным иметь флаги, которые нужно устанавливать как во время компиляции, так и снова во время выполнения.Являются ли эти флаги рудиментарными остатками усилий по добавлению параллелизма в GHC?

Ответы [ 3 ]

31 голосов
/ 14 сентября 2010

Пока вы разрабатываете программу, дополнительные +RTS ... не должны быть серьезными (хотя я признаю, что мне показалось странным, когда я впервые взял Haskell).Для окончательного (поставленного) двоичного файла вы можете связать его со статическими параметрами RTS ( GHC manual ), предоставив файл C, содержащий char *ghc_rts_opts = "-N";.

РЕДАКТИРОВАТЬ: Обновление этого вопроса для GHC 7.x, теперь есть способ указать параметры RTS во время компиляции:

ghc -threaded -rtsopts -with-rtsopts=-N

Этот 1) использует многопоточную систему времени выполнения 2) Включает параметры RTS 3) Устанавливает параметр RTS для использования столько потоков, сколькодоступны ядра (используйте -Nx, где x - это число, чтобы вручную контролировать количество потоков ОС).

8 голосов
/ 14 сентября 2010

Почему исполняемый файл во время выполнения не может обнаружить, что он был скомпилирован с -threaded, и использовать все ядра в системе, если не указано иное?

Это интересная функция!

Вы можете запросить его на трекере GHC: http://hackage.haskell.org/trac/ghc/wiki/ReportABug

4 голосов
/ 14 сентября 2010

Из руководства пользователя GHC (версия 6.12.1):

Пропуск x, т. Е. +RTS -N -RTS, позволяет среде выполнения самостоятельно выбирать значение x в зависимости от количества процессоров в вашей машине.

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

...