मुझे कम्प्यूटेशनल साइंस में C ++ अभिव्यक्ति टेम्प्लेट का उपयोग कब करना चाहिए, और मुझे उनका उपयोग * नहीं * कब करना चाहिए?


24

मान लीजिए कि मैं C ++ में एक वैज्ञानिक कोड पर काम कर रहा हूं। एक सहकर्मी के साथ हाल ही में चर्चा में, यह तर्क दिया गया था कि अभिव्यक्ति टेम्पलेट वास्तव में एक बुरी चीज हो सकती है, संभवतः सॉफ्टवेयर को केवल जीसी के कुछ संस्करणों पर अनिवार्य बना सकती है। माना जाता है कि इस समस्या ने कुछ वैज्ञानिक संहिताओं को प्रभावित किया है, जैसा कि डाउनफॉल के इस पैरोडी के उपशीर्षक में दिया गया है । (ये केवल उदाहरण हैं, जिनके बारे में मुझे पता है, इसलिए लिंक।)

हालांकि, अन्य लोगों ने तर्क दिया है कि अभिव्यक्ति टेम्पलेट्स उपयोगी हैं क्योंकि वे प्रदर्शन लाभ प्राप्त कर सकते हैं, जैसा कि SIAM जर्नल ऑफ साइंटिफिक कम्प्यूटिंग में इस पत्र में है , अस्थायी चर में मध्यवर्ती परिणामों के भंडारण से बचते हैं।

मुझे C ++ में टेम्पलेट मेटाप्रोग्रामिंग के बारे में पूरी जानकारी नहीं है, लेकिन मुझे पता है कि यह स्वचालित भेदभाव में और अंतराल अंकगणित में उपयोग किया जाने वाला एक दृष्टिकोण है, जो कि मैं अभिव्यक्ति टेम्पलेट्स के बारे में चर्चा में आया हूं। प्रदर्शन में संभावित लाभ और रखरखाव में संभावित नुकसान (यदि यह सही शब्द है) दोनों को देखते हुए, मुझे कम्प्यूटेशनल विज्ञान में C ++ अभिव्यक्ति टेम्पलेट का उपयोग कब करना चाहिए, और मुझे उनसे कब बचना चाहिए?


आह, वीडियो बहुत मजेदार है। मुझे नहीं पता था कि यह अस्तित्व में है। इसे किसने बनाया, क्या आप जानते हैं?
वोल्फगैंग बैंगर्थ

कोई जानकारी नहीं; PETSc लोगों के एक जोड़े ने मुझे एक बिंदु पर लिंक भेजा। मुझे लगता है कि एक FEniCS डेवलपर ने इसे बनाया है।
ज्योफ ऑक्सबेरी

वीडियो लिंक टूट गया है और मैं उत्सुकता से मर रहा हूं। नया लिंक?
प्रिक्सोलिटिक

ओह डॉटर, कभी नहीं, मुझे लगता है कि यूट्यूब हमारे हिटलर के वीडियो के लिए आया है
प्रिक्सोलिटिक

जवाबों:


17

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


हाँ, मैंने कुछ लंबे त्रुटि संदेश पहले देखे हैं जब मुझे gcc 2.95 से gcc 4.x पर कोड पोर्ट करना था, और संकलक सभी प्रकार की त्रुटियों को टेम्पलेट के बारे में बता रहा था। मेरा एक लैब-मेट C ++ में अंतराल अंकगणित के लिए एक टेम्प्लेटेड लाइब्रेरी विकसित कर रहा है (नई सुविधाओं को जोड़ना जो अधिक शोध को पूरा करने के लिए Boost :: Interval में नहीं हैं), और मैं यह देखना चाहता हूं कि कोड एक दुःस्वप्न बन जाए। संकलन करना।
ज्योफ ऑक्सबेरी

12

दूसरों ने इस मुद्दे पर टिप्पणी की है कि ईटी कार्यक्रमों के साथ-साथ त्रुटि संदेशों को समझने की जटिलता को लिखना कितना मुश्किल है। मुझे संकलक के मुद्दे पर टिप्पणी करने दें: यह सच है कि कुछ समय पहले बड़े मुद्दों में से एक संकलक मिल रहा था जो कि C ++ मानक के साथ पर्याप्त है जो सब कुछ काम करता है और इसे आंशिक रूप से काम करता है। परिणामस्वरूप, हमने बहुत सारे बग पाए - मेरे नाम में 2-300 बग रिपोर्ट हैं, जो कि जीसीसी, इंटेल आईसीसी, आईबीएम एक्सएलसी और पोर्टलैंड के पीजीसीसी पर वितरित हैं। नतीजतन, Deal.II कॉन्फ़िगरेशन स्क्रिप्ट बड़ी संख्या में संकलक बग परीक्षणों का भंडार है, मुख्य रूप से टेम्पलेट्स, मित्र घोषणाओं, नामस्थान, आदि के क्षेत्र में।

लेकिन, यह पता चला है कि संकलक निर्माताओं ने वास्तव में अपने कार्य को एक साथ पा लिया है: आज, जीसीसी और आईसीसी आज हमारे सभी परीक्षणों को पास करते हैं और उन दोनों के बीच पोर्टेबल है कोड लिखना आसान है। मैं कहूंगा कि पीजीआई बहुत पीछे नहीं है, लेकिन इसमें कई तरह की विचित्रताएँ हैं जो वर्षों से चली नहीं जा रही हैं। दूसरी ओर, xlC एक पूरी तरह से अलग कहानी है - वे हर 6 महीने में एक बग को ठीक करते हैं, लेकिन सालों तक उनके साथ बग रिपोर्ट दर्ज करने के बावजूद, प्रगति बेहद धीमी है और xlC ने कभी भी सौदा करने में सक्षम नहीं किया है। II सफलतापूर्वक।

यह सब क्या है इसका मतलब यह है: यदि आप दो बड़े संकलक के साथ चिपके रहते हैं, तो आप उम्मीद कर सकते हैं कि वे आज ही काम करेंगे। चूंकि आजकल अधिकांश कंप्यूटर और OS में आमतौर पर कम से कम एक होता है, वही पर्याप्त है। एकमात्र प्लेटफॉर्म जहां चीजें अधिक कठिन होती हैं, वह है ब्लूजेन, जहां सिस्टम कंपाइलर आमतौर पर xlC होता है, जिसमें उसके सभी बग होते हैं।


जिज्ञासा से बाहर, क्या आपने नए xlc संकलक के खिलाफ / क्यू पर संकलन करने की कोशिश की है?
एरन अहमदिया

नहीं। मैं स्वीकार करूंगा कि मैंने xlC को छोड़ दिया है।
वोल्फगैंग बंगर्थ

5

मैंने कुछ समय पहले ईटी के साथ थोड़ा सा प्रयोग किया है, जब आपने उल्लेख किया था, कंपाइलर अभी भी उनके साथ संघर्ष कर रहे थे। मैंने अपने कुछ कोड में रैखिक बीजगणित के लिए ब्लिट्ज लाइब्रेरी का उपयोग किया है । समस्या तब अच्छे संकलक को मिल रही थी और जैसा कि मैं एक संपूर्ण C ++ प्रोग्रामर नहीं हूं, संकलक त्रुटि संदेशों की व्याख्या कर रहा हूं। उत्तरार्द्ध बस असहनीय था। संकलक, औसतन, त्रुटि संदेशों की लगभग 1000 पंक्तियों को उत्पन्न करेगा। किसी भी तरह से मैं अपनी प्रोग्रामिंग त्रुटि को तुरंत खोजने में सक्षम नहीं था।

आप oonumerics वेबपेज पर अधिक जानकारी पा सकते हैं (दो ईटी कार्यशालाओं की कार्यवाही हैं)।

लेकिन मैं उनसे बहुत दूर रहूंगा…।


संकलक त्रुटि संदेश वास्तव में मेरी चिंताओं में से एक है। कुछ अस्थायी सी ++ कोड के साथ मैं अपनी परियोजनाओं के लिए पुस्तकालयों के निर्माण के लिए संकलन करता हूं, संकलक चेतावनी संदेशों की सैकड़ों लाइनें उत्पन्न कर सकता है। हालाँकि, यह मेरा कोड नहीं है, मैं इसे नहीं समझता, और आम तौर पर बोलना, यह काम करता है, इसलिए मैं इसे अकेला छोड़ देता हूं। लंबी, गुप्त त्रुटि संदेश डिबगिंग के लिए अच्छी तरह से नहीं है।
ज्योफ ऑक्सबेरी

4

समस्या पहले से ही 'अभिव्यक्ति टेम्पलेट्स (ET)' शब्द से शुरू होती है। मुझे नहीं पता कि इसके लिए कोई सटीक परिभाषा है या नहीं। लेकिन इसके आम उपयोग में यह किसी भी तरह से 'कैसे आप रैखिक बीजगणित अभिव्यक्ति कोड' और 'यह कैसे गणना की जाती है' जोड़ों। उदाहरण के लिए:

आप वेक्टर ऑपरेशन को कोड करें

v = 2*x + 3*y + 4*z;                    // (1)

और यह एक लूप द्वारा गणना की जाती है

for (int i=0; i<n; ++i)                 // (2)
    v(i) = 2*x(i) + 3*y(i) + 4*z(i);

मेरी राय में यह दो अलग-अलग चीजें हैं और इसे डिकोड करने की आवश्यकता है: (1) एक इंटरफ़ेस और (2) एक संभावित कार्यान्वयन है। मेरा मतलब है कि यह प्रोग्रामिंग में आम बात है। ज़रूर (2) एक अच्छा डिफ़ॉल्ट कार्यान्वयन हो सकता है, लेकिन सामान्य तौर पर मैं एक विशेष, समर्पित कार्यान्वयन का उपयोग करने में सक्षम होना चाहता हूं। उदाहरण के लिए, मैं चाहता हूँ कि एक समारोह की तरह

myGreatVecSum(alpha, x, beta, y, gamma, z, result);    // (3)

जब मुझे कोडिंग (1) आती है तो मुझे फोन किया जाता है। शायद (3) सिर्फ (2) की तरह आंतरिक रूप से एक लूप का उपयोग करता है। लेकिन वेक्टर आकार के आधार पर अन्य कार्यान्वयन अधिक कुशल हो सकते हैं। वैसे भी, उच्च प्रदर्शन में कुछ विशेषज्ञ जितना संभव हो उतना लागू और ट्यून (3) कर सकते हैं। इसलिए यदि (1) को (3) के कॉल पर मैप नहीं किया जा सकता है, तो मैं तुरंत (1) और सीधे कॉल (3) के सेनेटरी शुगर से बचता हूं।

मैं जो वर्णन करता हूं वह कोई नई बात नहीं है। इसके विपरीत, यह BLAS / LPACK के पीछे का विचार है:

  • LAPACK में सभी प्रदर्शन महत्वपूर्ण संचालन BLAS फ़ंक्शन को कॉल करके किया जाता है।
  • BLAS सिर्फ उन रैखिक बीजगणित अभिव्यक्तियों के लिए एक इंटरफ़ेस को परिभाषित करता है जिनकी आमतौर पर आवश्यकता होती है।
  • बीएलएएस के लिए अलग-अलग अनुकूलित कार्यान्वयन मौजूद हैं।

यदि BLAS का दायरा पर्याप्त नहीं है (जैसे यह एक फ़ंक्शन प्रदान नहीं करता है जैसे (3)) तो कोई BLAS का दायरा बढ़ा सकता है। तो 60 और 70 के दशक के इस डायनासोर को अपने पाषाण युग के उपकरण के साथ इंटरफ़ेस और कार्यान्वयन के स्वच्छ और ऑर्थोगोनल पृथक्करण का एहसास होता है। यह एक तरह से मज़ेदार है कि (अधिकांश) संख्यात्मक C ++ लाइब्रेरीज़ इस स्तर की सॉफ़्टवेयर गुणवत्ता को प्राप्त नहीं करती हैं। हालाँकि प्रोग्रामिंग भाषा अपने आप में बहुत अधिक परिष्कृत है। इसलिए यह कोई आश्चर्य की बात नहीं है कि BLAS / LAPACK अभी भी जीवित है और सक्रिय रूप से विकसित है।

इसलिए मेरी राय में ईटी प्रति से बुराई नहीं हैं। लेकिन वे आम तौर पर संख्यात्मक सी ++ पुस्तकालयों में कैसे उपयोग किए जाते हैं, ने उन्हें वैज्ञानिक कंप्यूटिंग हलकों में बहुत खराब प्रतिष्ठा अर्जित की।


माइकल, मुझे लगता है कि आप अभिव्यक्ति टेम्पलेट्स में से एक को याद कर रहे हैं। आपका कोड उदाहरण (1) वास्तव में किसी भी अनुकूलित BLAS कॉल को मैप नहीं करता है। वास्तव में, यहां तक ​​कि जब एक बीएलएएस दिनचर्या मौजूद होती है, तो बीएलएएस फ़ंक्शन कॉल का ओवरहेड छोटे वैक्टर और मैट्रिस के लिए काफी भयानक होता है। ब्लेज़ और ईजेन जैसी परिष्कृत अभिव्यक्ति टेम्पलेट लाइब्रेरी अस्थायी लोगों के उपयोग से बचने के लिए आस्थगित अभिव्यक्ति मूल्यांकन का उपयोग कर सकती हैं, लेकिन मुझे विश्वास है कि एक डोमेन विशिष्ट भाषा की लगभग कुछ भी नहीं हाथ से लुढ़का हुआ रैखिक बीजगणित को हरा देने में सक्षम होने जा रहा है।
एरन अहमदिया

नहीं, मुझे लगता है कि आप इस बिंदु को याद कर रहे हैं। आपको (क) बीएलएएस को कुछ अक्सर आवश्यक रेखीय बीजगणित ऑपरेशन (बी) एटलस, गोटोब्लास, आदि बीटीडब्ल्यू जैसे बीएलएएस के कार्यान्वयन के विनिर्देश के रूप में भेद करना होगा कि यह कैसे काम करता है: डिफ़ॉल्ट रूप से एक अभिव्यक्ति (1) बीएलएएस से तीन बार एक्सपी को बुलाकर मूल्यांकन किया जाए। लेकिन (1) को संशोधित किए बिना मैं भी इसका मूल्यांकन कर सकता था जैसे (2)। तो क्या होता है तार्किक रूप से निम्नलिखित है: यदि (1) की तरह एक ऑपरेशन महत्वपूर्ण है तो निर्दिष्ट बीएलएएस संचालन (ए) का सेट बढ़ाया जा सकता है।
माइकल लेह्न

तो मुख्य बिंदु यह है: 'v = x + y + z' जैसे नोटेशन और आखिरकार यह गणना कैसे की जाती है, को अलग किया जाना चाहिए। Eigen, MTL, BLITZ, ब्लेज़-लिब इस संबंध में पूरी तरह से विफल हैं।
माइकल लेहान

1
ठीक है, लेकिन अक्सर आवश्यक रैखिक बीजगणित संचालन की संख्या संयुक्त है। यदि आप C ++ जैसी भाषा का उपयोग करने जा रहे हैं, तो आपके पास अभिव्यक्ति टेम्प्लेट (यह ईजन / ब्लेज़ अप्रोच) का उपयोग करके उप-ब्लॉक और एल्गोरिदम को बुद्धिमानी से आस्थगित मूल्यांकन का उपयोग करके, या बड़े पैमाने पर लागू करने का विकल्प है। हर संभव दिनचर्या का पुस्तकालय। मैं या तो दृष्टिकोण की वकालत नहीं करता हूं, जैसा कि नंबा और साइथन में हाल के काम से पता चलता है कि हम पायथन जैसी उच्च-स्तरीय स्क्रिप्टिंग भाषाओं से काम कर रहे समान या बेहतर प्रदर्शन प्राप्त कर सकते हैं।
एरन अहमदिया

लेकिन फिर से, मैं जो शिकायत करता हूं वह यह तथ्य है कि इस तरह के परिष्कृत (जटिल लेकिन अनम्य के रूप में) पुस्तकालयों जैसे ईजेन कसकर युगल संकेतन और मूल्यांकन-तंत्र और यहां तक ​​कि लगता है कि यह एक अच्छी बात है। अगर मैं Matlab जैसे टूल का उपयोग करता हूं तो मैं सिर्फ चीजों को कोड करना चाहता हूं और भरोसा करता हूं कि Matlab सबसे अच्छा संभव काम कर रहा है। अगर मैं C ++ जैसी भाषा का उपयोग करता हूं तो मैं नियंत्रण में रहना चाहता हूं। इसलिए अगर एक डिफ़ॉल्ट मूल्यांकन-तंत्र मौजूद है, तो इसकी सराहना करें लेकिन इसे बदलना संभव है। अन्यथा मैं वापस जाता हूं और सी ++ में कार्यों को सीधे कॉल करता हूं।
माइकल लेह्न
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.