如何使用OCaml获取计算机上的核心数量?

时间:2013-04-29 00:01:44

标签: ocaml

我正在将我的OCaml程序中的一些工作并行化(使用parmap),但我不想将核心数量硬编码到我的应用程序中。有没有办法在运行时获得核心数量?我宁愿不再添加任何依赖项(超出parmap或JS的core)。我有一种感觉,我在stdlib看到一些简单的电话......

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

1 个答案:

答案 0 :(得分:8)

once有同样的问题。这就是我最终带来的(我不想要C绑定):

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

如果您不想Unix,可以通过open_process_in写入临时文件来替换Sys.command。在linux和osx上测试过,据报道当时没有在cygwin上进行过mingw工作。

更新。请注意,这不适用于freebsd,其中提到here需要使用 sysctl -n hw.ncpu。但是,由于Sys.os_type没有正确的粒度,因此只要uname -sSys.os_type不同,您就需要以Win32的结果为条件。