2013-04-29 28 views
5

Tôi đang song song một số công việc trong chương trình OCaml của mình (với parmap) nhưng tôi không muốn mã hóa cứng số lượng lõi vào ứng dụng của mình. Có cách nào để lấy số lõi trong thời gian chạy không? Tôi không muốn thêm bất kỳ phụ thuộc nào nữa (không có gì ngoài parmap hoặc JS của core). Tôi có cảm giác tôi đang tìm kiếm một số cuộc gọi đơn giản trong stdlib ...Làm thế nào để có được số lõi trên một máy với OCaml?

EDIT: không cần phải di chuyển. Làm việc trên Linux là đủ tốt.

+1

nếu bạn không tìm thấy bất cứ điều gì khác (không ủng hộ điều này như là một ví dụ tốt, nhưng một cái gì đó tôi đã hack trước) bạn luôn có thể phân tích cú pháp 'proc' để tìm nó. –

+0

Ya sẽ là trường hợp xấu nhất ... – rgrinberg

+0

Tôi chỉ đơn giản là quấn 'cpuinfo' với giao diện rõ ràng (tôi biết một số thư viện thực hiện điều này, nhưng không phải trong OCaml) hoặc thử sử dụng FFI từ [one from C] (http://stackoverflow.com/questions/4586405/get-number-of-cpus-in-linux-using-c). (Tôi biết bạn nói rằng bạn thích tránh giải pháp thứ hai, nhưng tôi đã sử dụng một cái gì đó tương tự cho profiling trong OCaml trước đây.) Lưu ý rằng ngay cả câu hỏi đó có thỏa thuận rộng mà phân tích 'proc' không phải là một điều xấu. –

Trả lời

8

I once có cùng một câu hỏi. Đó là những gì tôi cuối cùng đi kèm với (tôi không muốn ràng buộc 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 

Nếu bạn không muốn Unix bạn có thể thay thế open_process_in bởi một văn bản Sys.command vào một tập tin tạm thời. Thử nghiệm trên linux và osx, báo cáo để làm việc trên mingw nhưng không phải trên Cygwin vào thời điểm đó.

Cập nhật. Lưu ý rằng điều này không hoạt động trên freebsd, như đã đề cập here bạn cần sử dụng sysctl -n hw.ncpu. Tuy nhiên, kể từ khi Sys.os_type không có mức chi tiết phù hợp, bạn cần phải điều kiện hóa kết quả của uname -s bất cứ khi nào Sys.os_type khác với Win32.

+1

Tôi đã kiểm tra cách 'parmap' tính toán điều này và có vẻ như mặc định chỉ là' 2'. :(, bạn có thể muốn thêm đề xuất của bạn vào dự án đó. Chúc mừng – nlucaroni

+0

Có Tôi quên đề cập đến trong bài đăng vì tôi đã thực sự thử chức năng 'get_default_processors' (hoặc cái gì đó tương tự) của parmap và nó không hoạt động như được quảng cáo . – rgrinberg

Các vấn đề liên quan