Does Haskell have a method for determining the number of CPU cores present on a machine at runtime?
Yes, there is such a method. Code from "Real World Haskell": http://book.realworldhaskell.org/read/concurrent-and-multicore-programming.html
import GHC.Conc (numCapabilities)
main = putStrLn $ "number of cores: " ++ show numCapabilities
Since base
4.5 you can use getNumProcessors
from GHC.Conc. This is good since the number of capabilities can now be set dynamically with setNumCapabilities
from the same.
Since version 6.12, GHC RTS includes a function getNumberOfProcessors
, which is used to implement +RTS -N
. You can access it in much the same manner as ordinary foreign functions. Warning: GHC-only and only works if the program was built with -threaded
:
{-# LANGUAGE ForeignFunctionInterface #-}
import Foreign.C.Types (CInt)
foreign import ccall "getNumberOfProcessors" c_getNumberOfProcessors :: IO CInt
main :: IO ()
main = c_getNumberOfProcessors >>= print
Testing:
$ ghc --make -threaded Main.hs
[1 of 1] Compiling Main ( Main.hs, Main.o )
Linking Main ...
$ ./Main
1
You could copy'n'paste this code into a file called numCores
and compile it with your Haskell code. Than you can use the FFI to import its definition and use it directly in your Haskell code:
{-# 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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With