2013-04-29 5 views
5

Ich parallelisiere einige Arbeiten in meinem OCaml-Programm (mit parmap), aber ich würde es vorziehen, die Anzahl der Kerne in meiner Anwendung nicht hart zu codieren. Gibt es eine Möglichkeit, die Anzahl der Kerne zur Laufzeit zu erhalten? Ich würde es vorziehen, keine weiteren Abhängigkeiten hinzuzufügen (nichts außer parmap oder JS core). Ich habe das Gefühl, ich bin über einige einfache Anruf in stdlib ...Wie bekomme ich die Anzahl der Kerne auf einer Maschine mit OCaml?

EDIT: es muss nicht tragbar sein. Unter Linux zu arbeiten ist gut genug.

+1

Wenn Sie nichts anderes finden (nicht befürworten dies als ein gutes Beispiel, aber etwas, das ich schon einmal gehackt habe) können Sie immer "proc" analysieren, um es zu finden. –

+0

Ya das wäre der Worst-Case-Szenario ... – rgrinberg

+0

Ich würde entweder 'cpuinfo' einfach mit einer sauberen Schnittstelle (ich kenne mehrere Bibliotheken, die dies tun, aber nicht in OCaml) oder versuchen, FFI von [einer von C] (http://stackoverflow.com/questions/4586405/get-number-of-cpus-in-linux-using-c). (Ich weiß, du hast gesagt, dass du lieber die zweite Lösung vermeiden würdest, aber ich habe etwas Ähnliches für die Profilerstellung in OCaml verwendet.) Beachten Sie, dass selbst diese Frage weitgehend übereinstimmt, dass das Parsen von 'proc' nicht so schlecht ist. –

Antwort

8

I once hatte die gleiche Frage. Das ist, was schließlich kam ich mit (ich habe nicht C-Bindungen wollen):

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 

Wenn Sie nicht Unix wollen Sie open_process_in von einem Sys.command Schreiben in eine temporäre Datei ersetzen könnte. Getestet auf Linux und OSX, berichtet über die Arbeit an Mingw, aber nicht auf Cygwin zu der Zeit.

Aktualisierung. Beachten Sie, dass dies nicht auf freebsd funktioniert, wo wie erwähnt sysctl -n hw.ncpuhere verwendet werden müssen. Da jedoch Sys.os_type nicht die richtige Granularität aufweist, müssen Sie das Ergebnis von uname -s konditionieren, wenn sich Sys.os_type von Win32 unterscheidet.

+1

Ich überprüft, wie 'Parmap' dies berechnet, und es scheint, der Standard ist nur' 2'. :(, möchten Sie vielleicht Ihren Vorschlag zu diesem Projekt hinzufügen. Prost. – nlucaroni

+0

Ja, ich habe vergessen, das in der Post zu erwähnen, da ich tatsächlich habe versucht, parmap 'get_default_processors (oder so ähnlich) Funktion und es hat nicht funktioniert wie angekündigt . – rgrinberg

Verwandte Themen