2013-04-29 40 views
5

我在OCaml程序中並行化了一些工作(使用parmap),但我不想將核心數量硬編碼到我的應用程序中。有沒有辦法在運行時獲得內核數量?我寧願不要添加任何更多的依賴關係(除了parmap或JS的core之外沒有其他)。我有一種感覺,我在stdlib尋找一些簡單的電話...如何獲得OCaml機器上的內核數量?

編輯:它不必是便攜式。在Linux上工作就夠了。

+1

如果你沒有找到其他東西(不是主張這是一個很好的例子,但是我曾經被黑客入侵),你總是可以解析'proc'來找到它。 – 2013-04-29 00:04:09

+0

雅,這將是最壞的情況... – rgrinberg 2013-04-29 00:22:51

+0

我會簡單地用一個乾淨的接口(我知道幾個庫這樣做,但不是在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

回答

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你可以通過一個Sys.command寫作更換open_process_in到一個臨時文件。在linux和osx上測試過,據報告在mingw上工作,但當時沒有在cygwin上工作。

更新。請注意,這不適用於freebsd,如上所述here您需要使用 sysctl -n hw.ncpu。但是由於Sys.os_type沒有合適的粒度,因此只要Sys.os_typeWin32不同,就需要對uname -s的結果進行條件化。

+1

我檢查了'parmap'如何計算這個,它似乎默認只是'2'。 :(你可能想把你的建議加入到這個項目中)乾杯 – nlucaroni 2013-04-29 17:29:42

+0

是的我忘了在後面提到,因爲我實際上已經嘗試了parmap的'get_default_processors'(或類似的東西)函數,並且它沒有像廣告中那樣工作。 – rgrinberg 2013-04-29 17:59:56

相關問題