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

Ste*_*nce 15 haskell

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

Vik*_*ahl 17

是的,有这样一种方法.来自"Real World Haskell"的代码:http://book.realworldhaskell.org/read/concurrent-and-multicore-programming.html

import GHC.Conc (numCapabilities)

main = putStrLn $ "number of cores: " ++ show numCapabilities
Run Code Online (Sandbox Code Playgroud)

  • 请注意(正如本书所述),这只会给出通过`-N`提供给RTS的内核数量,它不一定等于物理内核的数量. (17认同)
  • @LouisWasserman另一种情况是一个类似make的程序,它想要启动N个外部进程,其中N =内核数量,但是它本身只使用一个功能(使用`-threaded`,因此FFI调用不会阻止整个处理). (5认同)

jbe*_*man 13

由于base4.5可以使用getNumProcessorsGHC.Conc.这很好,因为现在可以动态地设置功能的数量setNumCapabilities.


fuz*_*fuz 5

你可以将这个代码复制到一个被调用的文件中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
Run Code Online (Sandbox Code Playgroud)


Mik*_*kov 5

从版本6.12开始,GHC RTS 包含一个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
Run Code Online (Sandbox Code Playgroud)

测试:

$ ghc --make -threaded Main.hs
[1 of 1] Compiling Main             ( Main.hs, Main.o )
Linking Main ...
$ ./Main                      
1
Run Code Online (Sandbox Code Playgroud)