Ответ 1
Да, есть такой метод. Код от "Real World Haskell": http://book.realworldhaskell.org/read/concurrent-and-multicore-programming.html
import GHC.Conc (numCapabilities)
main = putStrLn $ "number of cores: " ++ show numCapabilities
Есть ли у Haskell метод определения количества ядер ЦП, присутствующих на машине во время выполнения?
Да, есть такой метод. Код от "Real World Haskell": http://book.realworldhaskell.org/read/concurrent-and-multicore-programming.html
import GHC.Conc (numCapabilities)
main = putStrLn $ "number of cores: " ++ show numCapabilities
Так как base
4.5, вы можете использовать getNumProcessors
из GHC.Conc. Это хорошо, так как число возможностей теперь можно динамически установить с помощью setNumCapabilities
из того же самого.
Вы можете скопировать'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
Начиная с версии 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
Это GHC.Conc.getNumProcessors :: IO Int
getNumCapabilities
указывает, сколько потоков предлагается для GHC (и зависит от параметра опции +RTS -N
.)