Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to find the number of cores at runtime in Haskell

Tags:

haskell

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

like image 423
Steve Severance Avatar asked Nov 07 '11 19:11

Steve Severance


4 Answers

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
like image 196
Viktor Dahl Avatar answered Dec 14 '22 23:12

Viktor Dahl


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.

like image 23
jberryman Avatar answered Dec 15 '22 01:12

jberryman


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
like image 21
Mikhail Glushenkov Avatar answered Dec 15 '22 01:12

Mikhail Glushenkov


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
like image 32
fuz Avatar answered Dec 15 '22 01:12

fuz