我正在并行化我的 OCaml 程序中的一些工作(使用parmap
),但我不希望将内核数量硬编码到我的应用程序中。有没有办法在运行时获取核心数量?我宁愿不再添加任何依赖项(除了parmap
JS's以外的任何东西core
)。我有一种感觉,我在看 stdlib 中的一些简单调用......
编辑:它不必是便携式的。在 linux 上工作就足够了。
我正在并行化我的 OCaml 程序中的一些工作(使用parmap
),但我不希望将内核数量硬编码到我的应用程序中。有没有办法在运行时获取核心数量?我宁愿不再添加任何依赖项(除了parmap
JS's以外的任何东西core
)。我有一种感觉,我在看 stdlib 中的一些简单调用......
编辑:它不必是便携式的。在 linux 上工作就足够了。
我曾经有过同样的问题。这就是我最终带来的(我不想要 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_in
Sys.command
更新。请注意,这在 freebsd 上不起作用,这里提到您需要使用
sysctl -n hw.ncpu
. 但是,由于Sys.os_type
没有正确的粒度,您需要以uname -s
任何时候的结果为条件Sys.os_type
与Win32
.