我在OCaml程序中並行化了一些工作(使用parmap
),但我不想將核心數量硬編碼到我的應用程序中。有沒有辦法在運行時獲得內核數量?我寧願不要添加任何更多的依賴關係(除了parmap
或JS的core
之外沒有其他)。我有一種感覺,我在stdlib尋找一些簡單的電話...如何獲得OCaml機器上的內核數量?
編輯:它不必是便攜式。在Linux上工作就夠了。
我在OCaml程序中並行化了一些工作(使用parmap
),但我不想將核心數量硬編碼到我的應用程序中。有沒有辦法在運行時獲得內核數量?我寧願不要添加任何更多的依賴關係(除了parmap
或JS的core
之外沒有其他)。我有一種感覺,我在stdlib尋找一些簡單的電話...如何獲得OCaml機器上的內核數量?
編輯:它不必是便攜式。在Linux上工作就夠了。
我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
你可以通過一個Sys.command
寫作更換open_process_in
到一個臨時文件。在linux和osx上測試過,據報告在mingw上工作,但當時沒有在cygwin上工作。
更新。請注意,這不適用於freebsd,如上所述here您需要使用 sysctl -n hw.ncpu
。但是由於Sys.os_type
沒有合適的粒度,因此只要Sys.os_type
與Win32
不同,就需要對uname -s
的結果進行條件化。
如果你沒有找到其他東西(不是主張這是一個很好的例子,但是我曾經被黑客入侵),你總是可以解析'proc'來找到它。 – 2013-04-29 00:04:09
雅,這將是最壞的情況... – rgrinberg 2013-04-29 00:22:51
我會簡單地用一個乾淨的接口(我知道幾個庫這樣做,但不是在OCaml)包裝'cpuinfo'或嘗試使用從[一個來自C]的FFI( http://stackoverflow.com/questions/4586405/get-number-of-cpus-in-linux-using-c)。 (我知道你說過你最好避免使用第二種解決方案,但我之前曾使用類似的方法在OCaml中進行性能分析。)請注意,即使是這個問題也有廣泛的共識,即解析'proc'並不是一件壞事。 – 2013-04-29 00:27:31