Steve Severance
Steve Severance

Reputation: 6646

How to find the number of cores at runtime in Haskell

Does Haskell have a method for determining the number of CPU cores present on a machine at runtime?

Upvotes: 18

Views: 2476

Answers (5)

Michal Gajda
Michal Gajda

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

Viktor Dahl
Viktor Dahl

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

jberryman
jberryman

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

fuz
fuz

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

Mikhail Glushenkov
Mikhail Glushenkov

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

Related Questions