5

我正在并行化我的 OCaml 程序中的一些工作(使用parmap),但我不希望将内核数量硬编码到我的应用程序中。有没有办法在运行时获取核心数量?我宁愿不再添加任何依赖项(除了parmapJS's以外的任何东西core)。我有一种感觉,我在看 stdlib 中的一些简单调用......

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

4

1 回答 1

8

曾经有过同样的问题。这就是我最终带来的(我不想要 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来替换。在 linux 和 osx 上测试过,据报道可以在 mingw 上工作,但当时不能在 cygwin 上工作。open_process_inSys.command

更新。请注意,这在 freebsd 上不起作用,这里提到需要使用 sysctl -n hw.ncpu. 但是,由于Sys.os_type没有正确的粒度,您需要以uname -s任何时候的结果为条件Sys.os_typeWin32.

于 2013-04-29T07:40:36.480 回答