如何在Haskell中找到运行时的核心数

时间:2011-11-07 19:56:33

标签: haskell

Haskell是否有一种方法可以确定运行时机器上存在的CPU核心数?

5 个答案:

答案 0 :(得分:17)

是的,有这样的方法。来自“真实世界Haskell”的代码:http://book.realworldhaskell.org/read/concurrent-and-multicore-programming.html

import GHC.Conc (numCapabilities)

main = putStrLn $ "number of cores: " ++ show numCapabilities

答案 1 :(得分:13)

base 4.5开始,您可以使用GHC.Conc中的getNumProcessors。这很好,因为现在可以使用setNumCapabilities动态设置功能的数量。

答案 2 :(得分:5)

您可以将'n'paste this code复制到名为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

答案 3 :(得分:5)

从版本6.12开始,GHC RTS includes a function getNumberOfProcessors,用于实现+RTS -N。您可以使用与普通外部函数非常相同的方式访问它。 警告:仅限GHC,仅在程序使用-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

答案 4 :(得分:-1)

GHC.Conc.getNumProcessors :: IO Int getNumCapabilities告诉GHC建议了多少个线程(并且取决于+RTS -N选项参数。)