Как найти количество ядер во время выполнения в Haskell

Есть ли у Haskell метод определения количества ядер ЦП, присутствующих на машине во время выполнения?

Ответы

Ответ 2

Так как base 4.5, вы можете использовать getNumProcessors из GHC.Conc. Это хорошо, так как число возможностей теперь можно динамически установить с помощью setNumCapabilities из того же самого.

Ответ 3

Вы можете скопировать'n'paste этот код в файл с именем numCores и скомпилировать его с помощью кода Haskell. Чем вы можете использовать FFI для импорта своего определения и использовать его непосредственно в вашем коде Haskell:

{-# LANGUAGE ForeignFunctionInterface #-}
import Control.Applicative ((<$>))
import Foreign.C.Types (CInt)

foreign import ccall "getNumCores" c_getNumCores :: IO CInt
getNumCores :: IO Int
getNumCores = fromEnum <$> c_getNumCores

Ответ 4

Начиная с версии 6.12, GHC RTS включает в себя функцию getNumberOfProcessors, которая используется для реализации +RTS -N. Вы можете получить к нему доступ так же, как и обычные иностранные функции. Предупреждение: GHC-only и работает только в том случае, если программа была построена с помощью -threaded:

{-# LANGUAGE ForeignFunctionInterface #-}
import Foreign.C.Types (CInt)

foreign import ccall "getNumberOfProcessors" c_getNumberOfProcessors :: IO CInt

main :: IO ()
main = c_getNumberOfProcessors >>= print

Тестирование:

$ ghc --make -threaded Main.hs
[1 of 1] Compiling Main             ( Main.hs, Main.o )
Linking Main ...
$ ./Main                      
1

Ответ 5

Это GHC.Conc.getNumProcessors :: IO Int getNumCapabilities указывает, сколько потоков предлагается для GHC (и зависит от параметра опции +RTS -N.)