2011-01-04 6 views
5

के साथ समांतरता मैं कुछ शोध कोड पर काम कर रहा हूं जो एक समारोह को अनुकूलित करने के लिए scipy.optimize.leastsq का उपयोग करता है। यह प्रति पुनरावृत्ति के बारे में 18 गुना करता है, इसलिए मैं चलने वाले समय को कम करने के लिए समानांतर में leastsq को कॉल करना चाहता हूं। यह कोई समस्या नहीं होनी चाहिए क्योंकि अनुकूलन लगभग पूरी तरह अलग हैं इसलिए बहुत कम सिंक्रनाइज़ेशन आवश्यक है। मुझे हाल ही में multiprocessing.pool.ThreadPool पता चला है जो मुझे साझा स्मृति को स्पष्ट रूप से स्थापित किए बिना ऐसा करने की अनुमति देगा (एक दर्द क्योंकि मेरे अधिकांश डेटा NumPy arrays में हैं)। इसलिए मैंने अपने कोड का थोड़ा सा पुनर्लेखन किया, उम्मीद है कि यह काम करेगा, लेकिन यह एक अजीब त्रुटि फेंकता है: SystemError: null argument to internal routineSciPy.optimize

def optfunc(id): 
    def errfunc(x): 
     return somedata[id] - somefunc(x) 

    lock.acquire() 
    x0 = numpy.copy(currentx[id]) 
    lock.release() 

    result = scipy.optimize.leastsq(errfunc, x0) 

    lock.acquire() 
    currentx[id] = result 
    lock.release() 

ThreadPool(processes=8).map(optfunc, range(idcount)) 

यह ठीक काम करना चाहिए, जब तक कि scipy.optimize.leastsq threadsafe नहीं है:

के बाद मेरे कोड का एक सरलीकरण है। तो मैंने scipy.optimize.leastsq के आसपास एक ताला लगाने की कोशिश की; लो और देखो यह काम करता है। हालांकि, प्रोसेसर उपयोग 100% पर अटक गया है, इसलिए यह मेरे लिए बेकार है।

मेरा प्रश्न है तो मैं इसके बारे में क्या कर सकता हूं? मुझे लगता है कि मेरी विकल्प हैं:

  1. एल एम के एक धागा सुरक्षित कार्यान्वयन का पता लगाएं
  2. धागे प्रक्रियाओं के बजाय का उपयोग करके देखें (मुझे नहीं लगता कि यह एक फर्क होता है)
(, levmar शायद?)

किसी भी मदद या सुझाव की सराहना की जाएगी।

+2

क्या आप विंडोज का उपयोग कर रहे हैं? विंडोज़ पर optimize.leastsq में थ्रेडिंग के साथ एक ज्ञात समस्या है: http://projects.scipy.org/scipy/ticket/1117। –

+0

हम्म, दिलचस्प है कि जब मैंने खोज की तो नहीं आया। मैं उबंटू का उपयोग कर रहा हूं लेकिन शायद यह दोनों ऑपरेटिंग सिस्टम को प्रभावित करता है। – Steve

उत्तर

-1

कितने सीपीयू/कोर? यदि आपके पास थ्रेडिंग के बिना 100% पर चल रहा है तो प्राप्त करने के लिए कुछ भी नहीं है। यदि leastq() थ्रेड सुरक्षित नहीं है, और आप अपने कंप्यूटर के 100% का उपयोग नहीं कर रहे हैं, तो आप प्रति कोर प्रोग्राम का एक उदाहरण चला सकते हैं और उदाहरण फाइल सिस्टम के माध्यम से सिंक्रनाइज़ कर सकते हैं।

+0

अनुसंधान मशीन पर 8 सीपीयू हैं। मुझे यकीन नहीं है कि आप क्यों कहते हैं कि 100% पर चलने पर कुछ भी हासिल नहीं किया जाएगा। जब मैंने ऊपर दिए गए उदाहरण की कोशिश की, तो सिस्टम सिस्टमर फेंकने से पहले कोड थोड़ी देर के लिए चलाएगा, और उस समय के दौरान यह 400% CPU उपयोग के आसपास हो रहा था। मैं आपके द्वारा प्रस्तावित समाधान का उपयोग करने के बारे में सोच रहा था, लेकिन मुझे लगता है कि इस बिंदु पर यह अधिक परेशानी हो सकती है। यद्यपि आपकी पोस्ट के लिए धन्यवाद। – Steve

2

धागे की बजाय प्रक्रियाओं का उपयोग करना एक फर्क पड़ेगा - यह काम करेगा कि प्रोग्राम थ्रेडसेफ है या नहीं। बेशक, यह तेजी से निर्भर करता है कि समस्या को हल करने में लिया गया समय ओवरहेड से बड़ा है।

प्रक्रियाओं का उपयोग करने के लिए सभी आवश्यक डेटा सेट अप करने के साथ कुछ अतिरिक्त परेशानी की आवश्यकता हो सकती है। multiprocessing मॉड्यूल हालांकि अधिकांश कामों का ख्याल रखता है, इसलिए ऐसा करना मुश्किल नहीं होना चाहिए।