我正在将我的OCaml程序中的一些工作并行化(使用parmap
),但我不想将核心数量硬编码到我的应用程序中。有没有办法在运行时获得核心数量?我宁愿不再添加任何依赖项(超出parmap
或JS的core
)。我有一种感觉,我在stdlib看到一些简单的电话......
编辑:它不一定是便携式的。在linux上工作已经足够了。
答案 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 -s
与Sys.os_type
不同,您就需要以Win32
的结果为条件。