2011-06-01 23 views
19

मैं कुछ कम्प्यूटेशनल-गहन पायथन कोड लिखने वाला हूं जो लगभग numpy के रैखिक बीजगणित कार्यों के भीतर अपना अधिकांश समय व्यतीत करेगा।numpy और ग्लोबल इंटरप्रेटर लॉक

हाथ में समस्या embarrassingly parallel है। लंबी कहानी छोटी, इसका लाभ लेने का सबसे आसान तरीका कई धागे का उपयोग करके होगा। मुख्य बाधा लगभग निश्चित रूप से ग्लोबल इंटरप्रेटर लॉक (जीआईएल) होने जा रही है।

इसे डिज़ाइन करने में सहायता के लिए, यह एक मानसिक मॉडल होना उपयोगी होगा जिसके लिए numpy संचालन से उनकी अवधि के लिए जीआईएल जारी करने की उम्मीद की जा सकती है। इस अंत में, मैं अंगूठे, डॉस और don'ts, पॉइंटर्स इत्यादि के किसी भी नियम की सराहना करता हूं

यदि यह मायने रखता है, तो मैं लिनक्स पर 64-बिट पायथन 2.7.1 का उपयोग कर रहा हूं, numpy 1.5.1 के साथ और scipy 0.9.0rc2, इंटेल एमकेएल 10.3.1 के साथ बनाया गया।

+0

क्या आपने थ्रेड के बजाय ['multiprocessing'] (http://docs.python.org/library/multiprocessing.html) lib का उपयोग करने पर विचार किया है? आपको अब जीआईएल के बारे में परेशान नहीं होना पड़ेगा। – Jeannot

+0

@ जेनोटॉट: मेरे पास है, धन्यवाद। समस्या की प्रकृति के कारण, थ्रेडिंग मेरी पहली पसंद है। अगर मैं इसे काम नहीं कर सकता, तो मैं विकल्पों को देखूंगा। – NPE

उत्तर

8

आपको शायद the official wiki पर न्यूमपी और समांतर प्रोग्रामिंग के संबंध में आपके सभी प्रश्नों के उत्तर मिलेंगे।

इसके अलावा, this recipe page पर एक नज़र डालें - इसमें कई धागे के साथ NumPy का उपयोग करने के तरीके पर उदाहरण कोड शामिल है।

+4

मैंने विकी पेज पर एक नज़र डाली थी, और इस बारे में बिल्कुल कोई जानकारी नहीं है कि कौन से numpy फ़ंक्शन करते हैं और जीआईएल जारी नहीं करते हैं। – DanielSank

3

शर्मनाक समानांतर? Numpy? PyCUDA या PyOpenCL के लिए एक अच्छे उम्मीदवार की तरह लगता है।

+1

ऐसा नहीं लगता है कि यह एक अच्छा जीपीयू समस्या है क्योंकि प्रत्येक धागा रैखिक बीजगणित कर रहा है। यद्यपि जीपीयू रैखिक बीजगणित पैकेज हैं। मेरे एक दोस्त ने हाल ही में एलएपीएसी के एसीएमएल-जीपीयू संस्करण का उपयोग करके निंदा की है। – kiyo

+0

थैनो नुकीले से संबंधित अनुप्रयोगों के लिए बेहतर विकल्प हो सकता है। –

1

काफी कुछ नापसंद दिनचर्या जीआईएल जारी करते हैं, इसलिए वे धागे (info) में कुशलतापूर्वक समानांतर हो सकते हैं। शायद आपको कुछ खास करने की ज़रूरत नहीं है!

आप this question का उपयोग यह पता लगाने के लिए कर सकते हैं कि आपको जिस दिनचर्या की आवश्यकता है वह जीआईएल जारी करने वालों में से एक है। संक्षेप में, स्रोत में ALLOW_THREADS या nogil के लिए खोजें।

(यह भी ध्यान रखें कि एमकेएल में नियमित रूप से एकाधिक धागे का उपयोग करने की क्षमता है, इसलिए समांतरता प्राप्त करने का यह एक और आसान तरीका है, हालांकि संभवतः सबसे तेज़ प्रकार नहीं)।