2016-01-14 3 views
14

जूलिया में devectorized कोड लिखने की तरह लगता है। यहां तक ​​कि package भी है जो आपके लिए ऐसा करने का प्रयास करता है।जूलिया में devectorization क्यों प्रोत्साहित किया जाता है?

मेरा प्रश्न है क्यों?

सबसे पहले, उपयोगकर्ता अनुभव पहलू से बात करते हुए, वेक्टरकृत कोड अधिक संक्षिप्त (कम कोड, फिर बग की कम संभावना), अधिक स्पष्ट (इसलिए डीबग करने में आसान), कोड लिखने का अधिक प्राकृतिक तरीका (कम से कम के लिए कोई भी जो वैज्ञानिक कंप्यूटिंग पृष्ठभूमि से आता है, जिसे जूलिया पूरा करने की कोशिश करता है)। vector'vector या vector'Matrix*vector जैसे कुछ लिखने में सक्षम होना बहुत महत्वपूर्ण है, क्योंकि यह वास्तविक गणितीय प्रतिनिधित्व के अनुरूप है, और इस तरह वैज्ञानिक कंप्यूटिंग लोग अपने सिर में (नेस्टेड लूप में नहीं) के बारे में सोचते हैं। और मुझे इस तथ्य से नफरत है कि यह लिखने का सबसे अच्छा तरीका नहीं है, और इसे लूप में दोबारा बदलना तेज होगा।

फिलहाल ऐसा लगता है कि तेजी से कोड लिखने के लक्ष्य और संक्षेप/स्पष्ट कोड को लिखने के लक्ष्य के बीच एक संघर्ष है।

दूसरा, इसके लिए तकनीकी कारण क्या है? ठीक है, मैं समझता हूं कि वेक्टरकृत कोड अतिरिक्त अस्थायी बनाता है, आदि, लेकिन वेक्टरकृत फ़ंक्शन (उदाहरण के लिए, broadcast(), map() इत्यादि) में उन्हें बहुसंख्यक बनाने की क्षमता है, और मुझे लगता है कि बहुप्रचार का लाभ अस्थायी लोगों के ऊपर से अधिक हो सकता है और वेक्टरकृत कार्यों के अन्य नुकसान उन्हें लूप के लिए नियमित से तेज बनाते हैं।

जूलिया में वेक्टरीकृत कार्यों के वर्तमान कार्यान्वयन क्या हुड के तहत बहुसंख्यक बहुप्रणाली करते हैं?

यदि नहीं, तो वेक्टर किए गए कार्यों के लिए निहित समेकन जोड़ने और उन्हें लूप से तेज़ बनाने के लिए काम/योजनाएं हैं?

+4

स्थिर जूलिया वर्तमान में v0.4 पर है। अधिकांश (सभी?) जिन चीज़ों के बारे में आप पूछ रहे हैं वे v1.0 के लिए रोडमैप पर हैं। तो, दस्तावेज़ों को भी शाब्दिक रूप से न लें। यदि आप वेक्टरकृत कोड लिखना चाहते हैं, तो वेक्टरकृत कोड लिखें। एक विकास लक्ष्य वेक्टरकृत जूलिया के लिए मैटलैब जितना तेज़ होगा। कई परिचालनों के लिए, यह पहले ही हासिल हो चुका है क्योंकि संकलक सही ढंग से व्याख्या करता है कि कौन से बीएलएएस दिनचर्या कॉल करने के लिए। मल्टीथ्रेडिंग के बारे में, मुझे लगता है कि आप कुछ tinkering के साथ बीएलएएस multithreading सक्षम कर सकते हैं, और यह v1.0 द्वारा मूल रूप से होना चाहिए। –

+5

जूलिया के पीछे मूल विकास विवरण "हम लालची हैं"। मूल देवता यह सब कुछ करने के लिए चाहते हैं, और इसे तेजी से करते हैं।भाषा को "दो भाषा की समस्या" को हल करना है, और इस स्तर पर, ऐसा लगता है कि यह v1.0 हिट के समय होगा। –

+1

अंतिम टिप्पणी (मैं वादा करता हूं): जूलिया * में देशी मल्टीथ्रेडिंग * के लिए जिथब मुद्दा पृष्ठ [यहां] है [https://github.com/JuliaLang/julia/issues/1790)। सुनिश्चित नहीं है कि उन्हें v0.5 रिलीज मिलेगा, लेकिन यह निश्चित रूप से रास्ते पर है। जब यह हिट होता है, तो मुझे उम्मीद है कि इसका लाभ उठाने के लिए सभी प्रमुख पैकेज अपडेट किए जाएंगे। –

उत्तर

14

आसान पढ़ने के लिए मैंने अपनी टिप्पणी मैराथन को उत्तर में बदलने का फैसला किया।

जूलिया के पीछे core development statement "हम लालची हैं"। कोर देव इसे सब कुछ करना चाहते हैं, और इसे तेज़ करें। विशेष रूप से, ध्यान दें कि भाषा "दो भाषा की समस्या" को हल करने के लिए है, और इस स्तर पर, ऐसा लगता है कि यह v1.0 हिट के समय तक इसे पूरा करेगा।

आपके प्रश्न के संदर्भ में, इसका मतलब है कि आप जो कुछ भी पूछ रहे हैं वह पहले से ही जूलिया का हिस्सा है, या v1.0 के लिए योजनाबद्ध है।

विशेष रूप से, इसका मतलब है कि यदि आपकी प्रोग्रामिंग समस्या स्वयं को वेक्टरकृत कोड में उधार देती है, तो वेक्टरकृत कोड लिखें। यदि लूप का उपयोग करना अधिक स्वाभाविक है, तो लूप का उपयोग करें।

v1.0 हिट के समय तक, अधिकांश वेक्टरकृत कोड Matlab में समकक्ष कोड की तुलना में तेज़, या तेज़ होना चाहिए। कई मामलों में, यह विकास लक्ष्य पहले से ही हासिल कर लिया गया है, क्योंकि जूलिया में कई वेक्टर/मैट्रिक्स ऑपरेशंस को संकलक द्वारा उचित बीएलएएस दिनचर्या में भेजा जाता है।

बहु थ्रेडिंग के संबंध में, देशी वर्तमान में जूलिया के लिए बहु-थ्रेडिंग लागू की जा रही है, और मेरा मानना ​​है कि मास्टर शाखा पर दिनचर्या का एक प्रयोगात्मक सेट पहले से ही उपलब्ध है। प्रासंगिक समस्या पृष्ठ here है। लागू कुछ वेक्टर/मैट्रिक्स संचालन के लिए बहुप्रतिष्ठक पहले ही जूलिया में उपलब्ध सिद्धांत में है, क्योंकि जूलिया ने बीएलएएस को कॉल किया है। मुझे यकीन नहीं है कि यह डिफ़ॉल्ट रूप से चालू है या नहीं।

हालांकि जागरूक रहें, कि कई वेक्टरकृत ऑपरेशन अभी भी (वर्तमान में) MATLAB में बहुत तेज होंगे, क्योंकि MATLAB वर्षों से विशेष बहु-थ्रेडेड सी पुस्तकालयों को लिख रहा है और फिर उन्हें हुड के नीचे बुला रहा है। एक बार जूलिया के मूल बहु-थ्रेडिंग होने के बाद, मुझे उम्मीद है कि जूलिया MATLAB से आगे निकल जाएगा, क्योंकि उस समय पूरे देव समुदाय मानक जूलिया पैकेज को खराब कर सकते हैं और जहां भी संभव हो वहां देशी बहु-थ्रेडिंग का लाभ उठाने के लिए उन्हें अपग्रेड कर सकते हैं।

इसके विपरीत, MATLAB में मूल बहु-थ्रेडिंग नहीं है, इसलिए आप अंतर्निहित सी पुस्तकालयों के रूप में विशेष बहु-थ्रेडेड रूटीन प्रदान करने के लिए गणित पर निर्भर हैं।

12

आप vector'*matrix*vector लिख सकते हैं (या शायद dot(vector, matrix*vector) यदि आप स्केलर आउटपुट पसंद करते हैं)। मैट्रिक्स गुणा जैसी चीजों के लिए, आप वेक्टरिज्ड नोटेशन का उपयोग करके बहुत बेहतर हैं, क्योंकि यह अंतर्निहित बीएलएएस पुस्तकालयों को कॉल करता है जो मूल रूप से किसी भी भाषा/कंपाइलर संयोजन द्वारा उत्पादित कोड से अधिक अनुकूलित होते हैं।

अन्य स्थानों में, जैसा कि आप कहते हैं कि तुम अस्थायी मध्यवर्ती से परहेज द्वारा devectorization से फायदा हो सकता: उदाहरण के लिए, अगर x एक वेक्टर, अभिव्यक्ति

y = exp(x).*x + 5 

3 अस्थायी वैक्टर बनाता है: a = exp(x) के लिए एक, के लिए एक b = a.*x और y = b + 5 के लिए एक। इसके विपरीत,

y = [exp(z)*z+5 for z in x] 

कोई अस्थायी मध्यवर्ती नहीं बनाता है। चूंकि जुलिआ में लूप और समझ तेजी से होती हैं, इसलिए डिवीक्टरिज्ड संस्करण लिखने का कोई नुकसान नहीं होता है, और वास्तव में इसे थोड़ा बेहतर प्रदर्शन करना चाहिए (विशेष रूप से @simd जैसे प्रदर्शन एनोटेशन के साथ, जहां उचित हो)।

धागे चीजें बदल सकते हैं के आगमन (exp एक "अनुभवहीन" की तुलना में तेजी vectorized जिससे exp), लेकिन सामान्य रूप में मैं कहेंगे आप एक "ओर्थोगोनल" मुद्दे के रूप में इस संबंध में करना चाहिए: जूलिया संभावना इसलिए करने के लिए आसान multithreading कर देगा इसका उपयोग करें कि आप स्वयं कई धागे का उपयोग करके संचालन लिख सकते हैं, और इसके परिणामस्वरूप वेक्टरकृत "लाइब्रेरी" दिनचर्या का अभी भी कोड पर कोई फायदा नहीं होता है जिसे आप स्वयं लिख सकते हैं। दूसरे शब्दों में, आप कई धागे का उपयोग कर सकते हैं लेकिन अभी भी उन अस्थायी से बचने के लिए devectorized कोड लिख सकते हैं।

लंबी अवधि में, "sufficiently smart compiler" अस्थायी रूप से इन परिचालनों में से कुछ को विचलित करने से अस्थायी से बच सकता है, लेकिन यह एक कठिन तरीका है, जो अनचाहे के संभावित जाल के साथ ऐसा लगता है।

आपका बयान है कि "वेक्टरकृत कोड हमेशा संक्षिप्त और समझने में आसान है" हालांकि, यह सच नहीं है: कई बार मैटलैब कोड लिखते समय, आपको लिखने के वेक्टरकृत तरीके से आने के लिए चरम पर जाना होगा लूप्स के मामले में सोचा जाने पर वास्तव में सरल संचालन होते हैं। आप अनगिनत उदाहरणों के लिए मेलिंग सूचियों को खोज सकते हैं; एक जिसे मैं एसओ पर याद करता हूं How to find connected components in a matrix using Julia है।

+0

'वेक्टर' * मैट्रिक्स * वेक्टर' का उपयोग 'वेक्टर'मैट्रिक्स * वेक्टर' पर क्या है? – aberdysh

+0

'मैट्रिक्स। * मैट्रिक्स' को "मैट्रिक्स गुणा की तरह" माना जाएगा? दूसरे शब्दों में, क्या यह बीएलएएस को कॉल करेगा, और इसलिए इस ऑपरेशन को इसके लूप समकक्ष से तेज कर देगा? जैसा कि आप जानते हैं कि इसे रैखिक बीजगणित में हैडमार्ड उत्पाद के रूप में परिभाषित किया गया है और यह समझना बहुत आसान है कि कोड हैडमार्ड उत्पाद प्रदर्शन कर रहा है जब आप 'मैट्रिक्स। * मैट्रिक्स' देखते हैं, जब इसे लूप – aberdysh

+0

@aberdysh में दोहराया जाता है, तो उन दो विकल्पों मेरे जैसा दिखता है। – tholy

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