OCaml プログラムでいくつかの作業を並列化しています ( を使用parmap
) が、アプリケーションにコア数をハード コードしたくないです。実行時にコア数を取得する方法はありますか? これ以上依存関係を追加しないことをお勧めします (parmap
または JS 以外のものはありませんcore
)。stdlib でいくつかの単純な呼び出しを見過ごしているような気がします...
編集: 移植可能である必要はありません。Linuxでの作業で十分です。
OCaml プログラムでいくつかの作業を並列化しています ( を使用parmap
) が、アプリケーションにコア数をハード コードしたくないです。実行時にコア数を取得する方法はありますか? これ以上依存関係を追加しないことをお勧めします (parmap
または JS 以外のものはありません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
には適切な粒度がないため、 when の結果がと異なるuname -s
場合に条件付けする必要があります。 Sys.os_type
Win32