2013-04-29 10 views
5

Paruję niektóre prace w moim programie OCaml (z parmap), ale wolałbym, aby nie kodować twardo liczby rdzeni w mojej aplikacji. Czy istnieje sposób na uzyskanie liczby rdzeni w czasie wykonywania? Wolałbym nie dodawać żadnych więcej zależności (nic poza parmap lub JS's core). Mam przeczucie, że szukam jakiegoś prostego połączenia w stdlib ...Jak uzyskać liczbę rdzeni na maszynie z OCaml?

EDYCJA: nie musi być przenośny. Praca na Linuksie jest wystarczająco dobra.

+1

jeśli nie znajdziesz nic innego (nie zalecając tego jako dobrego przykładu, ale coś, co wcześniej zhakowałem), zawsze możesz przetworzyć 'proc', aby go znaleźć. –

+0

To byłby najgorszy scenariusz ... – rgrinberg

+0

Chciałbym po prostu zawrzeć 'cpuinfo' z czystym interfejsem (znam kilka bibliotek, które to robią, ale nie w OCaml) lub spróbuj użyć FFI z [jeden z C] (http://stackoverflow.com/questions/4586405/get-number-of-cpus-in-linux-using-c). (Wiem, że powiedziałeś, że wolałbyś uniknąć drugiego rozwiązania, ale użyłem czegoś podobnego do profilowania w OCaml wcześniej.) Zauważ, że nawet to pytanie ma szeroką zgodność, że parsowanie 'proc' nie jest takie złe. –

Odpowiedz

8

I once miało to samo pytanie. To co w końcu przyszedł z (nie chciałem wiązań 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 

Jeśli nie chcesz Unix można zastąpić open_process_in przez Sys.command piśmie do pliku tymczasowego. Testowane na Linux i osx, zgłoszone do pracy na mingw, ale nie na Cygwin w tym czasie.

Aktualizacja. Należy zauważyć, że to nie działa na freebsd, gdzie jak wspomniano here trzeba użyć sysctl -n hw.ncpu. Jednak od Sys.os_type nie ma odpowiedniej ziarnistości, którą musisz ustabilizować na wynikach uname -s, gdy Sys.os_type różni się od .

+1

Sprawdziłem, jak oblicza to 'parmap', i wygląda na to, że domyślnie jest to' 2'. :(, możesz chcieć dodać swoją sugestię do tego projektu .. Pozdrowienia – nlucaroni

+0

Tak, zapomniałem wspomnieć o tym w poście, ponieważ faktycznie wypróbowałem funkcję 'get_default_processors' parmap (lub coś podobnego) i nie działało jak w reklamie . – rgrinberg

Powiązane problemy