कम्प्यूटेशनल साइंस में उपयोगी C ++ टेम्प्लेट का उपयोग करके जेनेरिक और मेटा-प्रोग्रामिंग किस सीमा तक है?


17

C ++ भाषा टेम्प्लेट के माध्यम से जेनेरिक प्रोग्रामिंग और मेटाप्रोग्रामिंग प्रदान करती है । इन तकनीकों में कई बड़े पैमाने पर वैज्ञानिक कंप्यूटिंग संकुल में अपना रास्ता मिल गया है (जैसे, MPQC , LAMMPS , CGAL , Trilinos )। लेकिन उन्होंने वास्तव में मूल्य में वैज्ञानिक कंप्यूटिंग में योगदान दिया है जो कि समग्र विकास समय और समान या पर्याप्त दक्षता के लिए प्रयोज्य के संदर्भ में गैर-जेनेरिक, गैर-मेटा भाषाओं जैसे सी या फोरट्रान से आगे निकल जाता है।

एक वैज्ञानिक कंप्यूटिंग कार्य को देखते हुए, C ++ टेम्प्लेट के माध्यम से जेनेरिक और मेटा-प्रोग्रामिंग किया गया है, जो किसी भी अच्छी तरह से समझे गए बेंचमार्क (कोड, व्यक्ति-प्रयास, आदि ...) द्वारा मापी गई उत्पादकता, अभिव्यक्ति या प्रयोज्य में सुधार का प्रदर्शन करता है? इसके विपरीत, जेनेरिक और मेटा प्रोग्रामिंग के लिए C ++ टेम्प्लेट के उपयोग से क्या जोखिम जुड़े हैं?


मुझे चिंता है कि यह सवाल राय के लिए भी खुला हो सकता है, लेकिन मैं यह देखना चाहता हूं कि समुदाय के लोग क्या कहते हैं।
20off पर ज्योफ ऑक्सबेरी

1
मैंने टिप्पणी को पूरी तरह से हटा दिया है। यदि आप चाहते हैं कि यह चैट या मेटा पर रिपॉजिट किया जाए तो मुझे खुशी होगी। मेरी मेटा यहाँ देखें ।
एरन अहमदिया

3
इसके अलावा, संबंधित प्रश्नों को देखें कि अभिव्यक्ति के खाके का उपयोग कब करना है और कब टालना है
एरन अहमदिया

मुझे नहीं लगता कि यह कहना सही है कि LAMMPS टेम्प्लेट या मेटाप्रोग्रामिंग का उपयोग करता है। LAMMPS एक ऑब्जेक्ट-ओरिएंटेड कोड है, जो कि ज्यादातर समय फोरट्रान की तरह दिखता है। मुझे नहीं लगता कि MPQC में बहुत अधिक अस्थायी है, लेकिन यह बहुत अधिक वस्तु-उन्मुख और बहुरूपी है।
जेफ

1
OpenFOAM टेम्प्लेट और C ++ की अन्य विशेषताओं का भारी उपयोग करता है।
दोहन ​​जो

जवाबों:


14

मुझे लगता है कि बड़े और टेम्प्लेट मेटाप्रोग्रामिंग को व्यवहार में अनुपयोगी पाया गया है - यह बहुत धीमी गति से संकलित होता है, और हमें प्राप्त होने वाले त्रुटि संदेश केवल समझने में असंभव होते हैं। मेटाप्रोग्रामिंग का उपयोग करते समय नए लोगों के लिए प्रवेश की बाधा भी बहुत अधिक है।

बेशक, जेनेरिक प्रोग्रामिंग एक पूरी तरह से अलग मुद्दा है, जैसा कि ट्रिलिनो द्वारा देखा गया है, Deal.II (मेरी अपनी लाइब्रेरी), DUNE, और कई अन्य लाइब्रेरी - अलग-अलग डेटा प्रकारों पर काम करने वाले एक ही अवधारणा को व्यक्त करते हुए एक नो-ब्रेनर की तरह है। और समुदाय ने बड़े पैमाने पर इसे स्वीकार कर लिया है जब तक कि यह सीमा के भीतर रहता है जो मेटाप्रोग्रामिंग की समस्याओं से बचते हैं। मुझे लगता है कि सामान्य प्रोग्रामिंग एक स्पष्ट सफलता के रूप में योग्य है।

बेशक, इन विषयों में से कोई भी तुरंत ओओपी से जुड़ा नहीं है। OOP, फिर से, क्या मैं कहूंगा, वैज्ञानिक कंप्यूटिंग समुदाय द्वारा सार्वभौमिक रूप से स्वीकार किया गया है। सामान्य प्रोग्रामिंग से भी कम, यह बहस का विषय नहीं है: पिछले 15 वर्षों में लिखी गई प्रत्येक सफल लाइब्रेरी (चाहे C ++, C या फोरट्रान में लिखी गई हो) OOP तकनीकों का उपयोग करती है।


4
नौसिखिए उपयोगकर्ताओं के लिए tmp मुश्किल हो सकता है, लेकिन यह अक्सर पुस्तकालय के अंदर बहुत अच्छी तरह से किया जाता है। इसकी उन तकनीकों में से एक है जो वास्तव में कोड की मात्रा को कम कर सकते हैं लेकिन आपको वास्तव में यह जानने की आवश्यकता है कि आप क्या कर रहे हैं। यदि आपको विश्वास नहीं है कि मैं Eigen या एलिमेंटल के स्रोत को पढ़ता हूँ। इसका सुंदर कोड है कि बिना टेम्पलेट्स बहुत असंभव हो जाएगा।
एटरेल

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

15

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

उदाहरण के तौर पर पेट्सक को लें। PETS OOP के एक निरीक्षक / निष्पादक मॉडल का उपयोग करता है, जहाँ इसका कोई भी एल्गोरिथम किसी दिए गए ऑब्जेक्ट में उपलब्ध दिनचर्या को चुनता है जो कि दिनचर्या को पूरा करने के लिए निष्पादित करता है। यह उपयोगकर्ता को चिंताओं को अलग करने की अनुमति देता है, उदाहरण के लिए मैट्रिक्स कार्रवाई में किसी भी प्रकार की अवरुद्ध या अनुकूलित दिनचर्या शामिल हो सकती है और प्रभावी रूप से कई पुनरावृत्तियों सॉल्वरों द्वारा इसका उपयोग किया जा सकता है। उपयोगकर्ता को अपने स्वयं के डेटा प्रकारों और मूल्यांकन को निर्दिष्ट करने की क्षमता प्रदान करने से, उन्हें कुछ महत्वपूर्ण दिनचर्याएँ मिलती हैं और पूरे पुस्तकालय की कार्यक्षमता अभी भी उपलब्ध है।

एक और उदाहरण मैं दे रहा हूँ FEniCS और deal.II। ये दोनों पुस्तकालय OOP का उपयोग बड़ी संख्या में परिमित तत्व विधियों के सामान्यीकरण के लिए करते हैं। तत्व प्रकार, तत्व क्रम, चतुर्भुज निरूपण, आदि से सब कुछ में विनिमेय है। हालांकि ये दोनों पुस्तकालय कुछ विशेष-उद्देश्य वाले FEM कोड्स की तुलना में "धीमे" हैं, लेकिन वे उपयोगकर्ता के लिए FEM की अधिक जटिलता के साथ कई प्रकार की समस्याओं को हल करने में सक्षम हैं।

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

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


3

OOPवैज्ञानिक कंप्यूटिंग के लिए क्या भाषा जैसी सुविधाएँ अधिक कॉम्पैक्ट कोड स्टेटमेंट के लिए बनाई गई हैं जो कोड को बेहतर ढंग से समझने और उपयोग करने में मदद करती हैं। उदाहरण के लिए, FFTरूटीन को कोड को बोझिल बनाने वाले प्रत्येक फ़ंक्शन कॉल के लिए बड़ी संख्या में तर्क करने की आवश्यकता होती है।

कॉल के समय केवल उसी चीज moduleया classस्टेटमेंट का उपयोग किया जाता है, जिसे पास किया जा सकता है, क्योंकि बाकी तर्क समस्या सेटअप (यानी सरणियों और गुणांक के आकार) से संबंधित हैं।

मेरे अनुभव में, मुझे SUBROUTINE55 तर्कों (इन एंड आउट) के साथ कॉल आया था और मैंने इसे घटाकर 5 को बेहतर कोड बना दिया।

वह मूल्य है।


3

मैं वैज्ञानिक कंप्यूटिंग के लिए सामान्य प्रोग्रामिंग और मेटा-प्रोग्रामिंग का एक मजबूत वकील हूं। मैं वास्तव में फील ++ (http://www.feelpp.org) नामक इन तकनीकों के आधार पर गैलेरिन विधियों के लिए एक मुफ्त सॉफ्टवेयर सी ++ पुस्तकालय विकसित कर रहा हूं जो लगातार गति प्राप्त कर रहा है। यह सच है कि धीमे संकलन के समय में अभी भी कठिनाइयाँ हैं और यदि सीखने की अवस्था को समझना है तो कोई भी समझ सकता है कि दृश्य के पीछे क्या चल रहा है। यह हालांकि बेहद दिलचस्प और दिमाग उड़ाने वाला है। यदि लाइब्रेरी स्तर पर किया जाता है और एक डोमेन विशिष्ट भाषा के पीछे जटिलता को छुपाता है, तो आपको एक अत्यंत शक्तिशाली उपकरण मिलता है। हमारे पास हमारे निपटान में उपयोग करने और तुलना करने के लिए एक बहुत विस्तृत श्रृंखला है। वैज्ञानिक कंप्यूटिंग के शिक्षण उद्देश्य के लिए यह बहुत बढ़िया है, अनुसंधान और नए संख्यात्मक तरीकों के लिए भी, बड़े पैमाने पर अनुप्रयोगों के लिए, अच्छी तरह से हम इस पर काम करते हैं लेकिन अभी तक बहुत अच्छा है, हम पहले से ही कुछ अच्छा सामान कर सकते हैं। हमारे पास इसका उपयोग करने वाले इंजीनियर, भौतिक विज्ञानी और गणितज्ञ हैं: उनमें से ज्यादातर सिर्फ भाषा का उपयोग परिवर्तनकारी सूत्रीकरण के लिए करते हैं और वे इसके लिए खुश हैं। हमारे भौतिकविदों सहकर्मियों के कुछ योगों को देखते हुए, मैं वैचारिक सूत्रीकरण का वर्णन करने के लिए उच्च स्तरीय भाषा के बिना उन्हें "हाथ से" करते हुए नहीं देखना चाहता। मैं व्यक्तिगत रूप से मानता हूं कि ये "तकनीक" या "प्रतिमान" अब एक विशाल कारक द्वारा कोड आकार को गुणा करने के साथ वैज्ञानिक कंप्यूटिंग कोड में जटिलता से निपटने के लिए आवश्यक हैं। C ++ में मेटा-प्रोग्रामिंग के समर्थन में सुधार करने की आवश्यकता है, लेकिन यह विशेष रूप से C ++ 11 के बाद से पहले से ही अच्छी स्थिति में है।


2

आप अपने प्रश्न के लिए प्रासंगिक http://arxiv.org/abs/1104.1729 पेपर पा सकते हैं । यह प्रदर्शन के परिप्रेक्ष्य से अभिव्यक्ति टेम्पलेट्स (वैज्ञानिक कोड में उपयोग किए गए टेम्पलेट मेटा-प्रोग्रामिंग का एक विशेष अनुप्रयोग) पर चर्चा करता है।


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

@ मातृ: यह ठीक इसके विपरीत है जिसके बारे में मैं सोच रहा हूं। यह जानते हुए कि आपको विकास के अंतिम चरण के रूप में हाथ से अनुकूलन करना होगा, आप अंतिम चरण से पहले किस भाषा का उपयोग करने के लिए आधार का चयन करेंगे? क्या हमारे पास सुझाव देने के लिए कठिन डेटा है कि किस भाषा का चयन करें?
मृत्युभोज

9
@Deathbreath: मैं एक उत्तर दूंगा जो मैंने कई अन्य थ्रेड्स पर भी किया है - जो कि और बड़े द्वारा, आपके कोड से अंतिम बिट की गति को ट्यूनिंग कुछ ऐसा है जो आप बहुत कम करते हैं। लेकिन आप हर समय उच्च स्तरीय एल्गोरिदम का कार्यक्रम करते हैं। इसलिए उस भाषा को चुनें जो आपको बड़े सामान को जल्दी से करने की अनुमति देती है। हमेशा निम्न-स्तरीय सामान को किसी भी तरह से शामिल करने का एक तरीका है, लेकिन यह वह चीज नहीं होनी चाहिए जो प्रोग्रामिंग भाषा की आपकी पसंद को निर्धारित करती है।
वोल्फगैंग बंगर्थ

0

रन-टाइम पर टाइप / डोमेन चेक हटाने में टेम्प्लेट बहुत अच्छे हैं। संकलन के समय इन पर ध्यान दिया जा सकता है। यह सी या फोरट्रान में उसी प्रकार के कार्यान्वयन पर सिद्धांत में प्रदर्शन को बढ़ा सकता है जहां प्रकार की जाँच केवल रन-टाइम पर की जा सकती है - चेक को स्रोत कोड में लागू किया जाता है। हालाँकि, आप precompiler विकल्पों का उपयोग करके C में समान परिणाम प्राप्त कर सकते हैं लेकिन इन्हें टेम्पलेट के विपरीत हाथ से करना होगा।

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.