如何使用OCaml获取机器上的内核数?

如何使用OCaml获取机器上的内核数?,ocaml,Ocaml,我正在并行化OCaml程序中的一些工作(使用parmap),但我不希望将内核数硬编码到我的应用程序中。有没有办法在运行时获得内核的数量?我不希望再添加任何依赖项(除了parmap或JS的core之外,没有其他依赖项)。我有一种感觉,我正在寻找一些简单的调用在stdlib 编辑:它不必是便携式的。在linux上工作已经足够好了。我也有同样的问题。这就是我最终得到的(我不想要C绑定): 如果您不想使用Unix,可以用Sys.command写入临时文件来替换open\u process\u in。在l

我正在并行化OCaml程序中的一些工作(使用
parmap
),但我不希望将内核数硬编码到我的应用程序中。有没有办法在运行时获得内核的数量?我不希望再添加任何依赖项(除了
parmap
或JS的
core
之外,没有其他依赖项)。我有一种感觉,我正在寻找一些简单的调用在stdlib

编辑:它不必是便携式的。在linux上工作已经足够好了。

我也有同样的问题。这就是我最终得到的(我不想要C绑定):

如果您不想使用
Unix
,可以用
Sys.command
写入临时文件来替换
open\u process\u in
。在linux和osx上测试,当时报告在mingw上工作,但在cygwin上没有

更新。请注意,这在freebsd上不起作用,正如前面提到的,您需要使用
sysctl-n hw.ncpu
。但是,由于
Sys.os_type
没有正确的粒度,因此每当
Sys.os_type
Win32
不同时,您需要根据
uname-s
的结果设置条件

如果你找不到任何其他东西(不是把它作为一个好例子,而是我以前入侵过的东西),你总是可以解析
proc
来找到它。是的,那将是最糟糕的情况……我要么简单地用一个干净的接口包装
cpuinfo
(我知道有几个库可以这样做,但不是用OCaml)或者尝试使用来自的FFI。(我知道你说你更喜欢避免第二种解决方案,但我以前在OCaml中使用过类似的分析方法。)注意,即使是这个问题也有广泛的共识,解析
proc
并不是一件坏事。你可能应该fork parmap并包含一个函数,以获取作为导入的C函数的内核数。有关如何在多个平台上检测C中的内核数量的详细信息,请参阅。就我个人而言,我会将
Setcore
模块更改为包含该函数。然后当然会将您的更改推到上游以包含:)我检查了
parmap
如何计算此值,似乎默认值只是
2
:(,你可能想把你的建议添加到那个项目中。干杯。是的,我在帖子中忘了提到这一点,因为我确实尝试过parmap的
获取默认处理器
(或类似的)功能,但它并没有像广告中那样工作。
let cpu_count () = 
  try match Sys.os_type with 
  | "Win32" -> int_of_string (Sys.getenv "NUMBER_OF_PROCESSORS") 
  | _ ->
      let i = Unix.open_process_in "getconf _NPROCESSORS_ONLN" in
      let close () = ignore (Unix.close_process_in i) in
      try Scanf.fscanf i "%d" (fun n -> close (); n) with e -> close (); raise e
  with
  | Not_found | Sys_error _ | Failure _ | Scanf.Scan_failure _ 
  | End_of_file | Unix.Unix_error (_, _, _) -> 1