Reputation: 6646
Does Haskell have a method for determining the number of CPU cores present on a machine at runtime?
Upvotes: 18
Views: 2476
Reputation: 653
It is GHC.Conc.getNumProcessors :: IO Int
. The
getNumCapabilities
tells how many threads are suggested to GHC (and depends on +RTS -N
option parameter.)
Upvotes: -1
Reputation: 1990
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
Upvotes: 19
Reputation: 16635
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.
Upvotes: 16
Reputation: 92966
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
Upvotes: 6
Reputation: 15038
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
Upvotes: 6