如何在Haskell中查找运行时的内核数

如何在Haskell中查找运行时的内核数,haskell,Haskell,Haskell是否有一种方法来确定运行时机器上存在的CPU内核数?是的,有这样一种方法。来自“真实世界Haskell”的代码: 您可以将“n”粘贴复制到名为numCores的文件中,并使用Haskell代码编译它。然后,您可以使用FFI导入其定义并直接在Haskell代码中使用: {-# LANGUAGE ForeignFunctionInterface #-} import Control.Applicative ((<$>)) import Foreign.C.Types (CI

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

是的,有这样一种方法。来自“真实世界Haskell”的代码:

您可以将“n”粘贴复制到名为
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
{-#语言外来函数接口#-}
导入控件。应用程序(())
进口国外C.类型(CInt)
国外进口商品:所有“getNumCores”c_getNumCores::IO CInt
getNumCores::IO Int
getNumCores=从枚举c_getNumCores

自6.12版以来,GHC RTS用于实施。您可以使用与普通外部函数大致相同的方式访问它警告:仅GHC,并且仅当程序是使用
线程化的
构建时才有效:

{-# 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

由于
base
4.5,您可以从中使用
getNumProcessors
。这是很好的,因为现在可以从同一个位置使用
setNumCapabilities
动态设置功能的数量。

它是
GHC.Conc.getNumProcessors::IO Int

getNumCapabilities
告诉GHC建议的线程数(取决于
+RTS-N
选项参数)。

注意(如本书所述),这仅提供通过
-N
提供给RTS的内核数,这不一定等于物理内核的数量。这是Haskell将被允许访问的内核数量……这几乎可以肯定是OP真正想要的吗?@LouisWasserman:我可以看到程序可能希望使用所需数量的内核的用例(没有明确授予这样做的许可)。或者,有人可能希望编写一个程序来获取硬件统计数据。但是他们不能使用超过通过-N提供给RTS的数量的内核,即使他们愿意。您描述的第二种情况是我能想象到的唯一的另一种情况。@LouisWasserman另一种情况是一个类似make的程序,它想要启动N个外部进程,其中N=内核数,但它本身只使用一个功能(使用
-线程化
,这样FFI调用就不会阻塞整个进程)。
$ ghc --make -threaded Main.hs
[1 of 1] Compiling Main             ( Main.hs, Main.o )
Linking Main ...
$ ./Main                      
1