Подтвердить что ты не робот

Почему вы должны использовать флаг компилятора и флаг времени выполнения для получения поддержки многоядерности в Haskell?

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

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

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


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

4b9b3361

Ответ 1

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

EDIT: обновив этот вопрос для GHC 7.x, теперь есть возможность указать параметры RTS во время компиляции:

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

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

Ответ 2

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

Это интересный запрос функции!

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

Ответ 3

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

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

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