5

OCaml プログラムでいくつかの作業を並列化しています ( を使用parmap) が、アプリケーションにコア数をハード コードしたくないです。実行時にコア数を取得する方法はありますか? これ以上依存関係を追加しないことをお勧めします (parmapまたは JS 以外のものはありません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には適切な粒度がないため、 when の結果がと異なるuname -s場合に条件付けする必要があります。 Sys.os_typeWin32

于 2013-04-29T07:40:36.480 に答える