Haskell是否有一种方法可以确定运行时机器上存在的CPU核心数?
答案 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
选项参数。)