2013-04-29 6 views
5

मैं अपने ओकैमल प्रोग्राम में कुछ काम समानांतर कर रहा हूं (parmap के साथ) लेकिन मैं अपने आवेदन में कोर की संख्या को कड़ी मेहनत नहीं करना चाहूंगा। रनटाइम पर कोर की संख्या प्राप्त करने का कोई तरीका है? मैं और अधिक निर्भरता नहीं जोड़ना चाहूंगा (parmap या जेएस के core से परे कुछ भी नहीं)। मुझे लगता है कि मैं stdlib में कुछ सरल कॉल देख रहा हूं ...OCaml के साथ मशीन पर कोर की संख्या कैसे प्राप्त करें?

संपादित करें: इसे पोर्टेबल नहीं होना चाहिए। लिनक्स पर काम करना काफी अच्छा है।

+1

यदि आपको कुछ और नहीं मिला है (यह एक अच्छा उदाहरण के रूप में वकालत नहीं कर रहा है, लेकिन कुछ मैंने पहले हैक किया है) तो आप इसे खोजने के लिए हमेशा 'proc' को पार्स कर सकते हैं। –

+0

हां यह सबसे खराब स्थिति परिदृश्य होगा ... – rgrinberg

+0

मैं या तो एक साफ इंटरफेस के साथ बस 'cpuinfo' लपेटूंगा (मुझे कई पुस्तकालयों को पता है जो यह करते हैं, लेकिन ओकैम में नहीं) या एफएफआई का उपयोग करके [सी से एक] http://stackoverflow.com/questions/4586405/get-number-of-cpus-in-linux-using-c)। (मुझे पता है कि आपने कहा था कि आप दूसरे समाधान से बचना पसंद करते हैं, लेकिन मैंने पहले ओकैम में प्रोफाइलिंग के लिए कुछ ऐसा ही इस्तेमाल किया है।) ध्यान दें कि उस प्रश्न में व्यापक समझौता है कि 'proc' को पार्स करना इतना बुरा नहीं है। –

उत्तर

8

I once एक ही प्रश्न था। यही कारण है कि मैं अंत में (मैं सी बाइंडिंग नहीं करना चाहता था) के साथ आया है:

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 बदल सकते थे। लिनक्स और ओएसएक्स पर परीक्षण किया गया, मिंगव पर काम करने की सूचना दी, लेकिन उस समय साइगविन पर नहीं।

अद्यतन। ध्यान दें कि यह freebsd पर काम नहीं करता है, जैसा कि here का उल्लेख किया गया है, आपको sysctl -n hw.ncpu का उपयोग करने की आवश्यकता है। हालांकि Sys.os_type में uname -s के परिणामस्वरूप Win32 से अलग होने पर आपको सही ग्रैन्युलरिटी नहीं है, तो आपको uname -s के परिणाम पर सशर्त बनाने की आवश्यकता होगी।

+1

मैंने जांच की कि कैसे 'परमाप' इसकी गणना करता है, और ऐसा लगता है कि डिफ़ॉल्ट केवल '2' है। :(, आप उस प्रोजेक्ट में अपना सुझाव जोड़ना चाहेंगे। चीयर्स। – nlucaroni

+0

हां मैं उस पोस्ट में उल्लेख करना भूल गया क्योंकि मैंने वास्तव में परमप के 'get_default_processors' (या ऐसा कुछ) फ़ंक्शन का प्रयास किया है और यह विज्ञापन के रूप में काम नहीं करता है । – rgrinberg

संबंधित मुद्दे