मैं वर्तमान में एक सिमुलेशन टूल के प्रबंधन के लिए सी ++ स्पैर मैट्रिक्स/गणित/पुनरावृत्त सॉल्वर लाइब्रेरी पर काम कर रहा हूं। हालांकि, मैंने मौजूदा पैकेज का उपयोग करना पसंद किया होगा, हालांकि, व्यापक जांच के बाद, कोई भी नहीं मिला जो हमारे सिम्युलेटर के लिए उपयुक्त था (हमने फ़्लेंस, यह ++, पीटीएससी, ईजिन और कई अन्य लोगों को देखा)। अच्छी खबर यह है कि मेरे हलकों और स्पैर मैट्रिक्स संरचनाएं अब बहुत ही कुशल और मजबूत हैं। बुरी खबर यह है कि, अब मैं ओपनएमपी का उपयोग करके समांतरता की तलाश में हूं, और सीखने की अवस्था थोड़ा खड़ी है।ओपनएमपी का उपयोग कर समांतरता के कई स्तर - संभव? होशियार? प्रैक्टिकल?
हमारे द्वारा हल किए जाने वाले डोमेन को उप-डोमेन में विभाजित किया जा सकता है, जो एक ब्लॉक-विकर्ण प्रारूप में एक साथ आते हैं। तो हमारी स्टोरेज योजना उप-डोमेन (जैसे संपीड़ित पंक्ति भंडारण: सीआरएस, संपीड़ित विकर्ण भंडारण: सीडीएस, घने, आदि ..) के लिए उपयुक्त प्रारूप के साथ छोटे स्क्वायर मैट्रिस (ब्लॉक []) की एक सरणी की तरह दिखती है। और एक पृष्ठभूमि मैट्रिक्स (वर्तमान में सीआरएस का उपयोग) जो उप-डोमेन के बीच कनेक्टिविटी के लिए जिम्मेदार है।
अधिकांश (सभी?) पुनरावृत्त सॉल्वर में "हॉट स्पॉट" मैट्रिक्स वेक्टर गुणात्मक ऑपरेशन है, और यह मेरी लाइब्रेरी के बारे में सच है। इस प्रकार, मैं अपने एमएक्सवी रूटीन को अनुकूलित करने के अपने प्रयासों पर ध्यान केंद्रित कर रहा हूं। ब्लॉक विकर्ण संरचना के लिए, के लिए एम * एक्स = ख छद्म कोड के रूप में किया जाएगा इस प्रकार है:
b=background_matrix*x
start_index = 1;
end_index = 0;
for(i=1:number of blocks) {
end_index=start_index+blocks[i].numRows();
b.range(start_index, end_index) += blocks[i] * x.range(start_index, end_index);
start_index = end_index+1;
}
जहां background_matrix पृष्ठभूमि है (सीआरएस) मैट्रिक्स, ब्लॉक सब-डोमेन मैट्रिक्स की सरणी, और .range है एक प्रारंभिक सूचकांक से एक अंत सूचकांक तक वेक्टर का हिस्सा देता है।
जाहिर है कि लूप समानांतर हो सकता है (और किया गया है), क्योंकि ऑपरेशन लूप के अन्य पुनरावृत्तियों से स्वतंत्र हैं (श्रेणियां गैर-ओवरलैपिंग हैं)। चूंकि हमारे पास एक ठेठ प्रणाली में 10-15 ब्लॉक हैं, इसलिए 4+ धागे वास्तव में एक महत्वपूर्ण अंतर बनाते हैं।
दूसरी जगह जहां समांतरता को एक अच्छा विकल्प माना गया है, प्रत्येक उप-डोमेन संग्रहण योजना (उपरोक्त कोड में पंक्ति 1 और 6 में कॉल) के लिए एमएक्सवी ऑपरेशन में है। समानांतर सीआरएस, सीडीएस, और घने मैट्रिक्स एमएक्सवी संचालन पर बहुत कुछ है। आम तौर पर 2 धागे के साथ एक अच्छा बढ़ावा देखा जाता है, जिसमें बहुत कम रिटर्न होते हैं क्योंकि अधिक धागे जोड़े जाते हैं।
मैं एक योजना की कल्पना कर रहा हूं, जहां उपरोक्त कोड के लिए ब्लॉक लूप में 4 धागे का उपयोग किया जाएगा, और उनमें से प्रत्येक थ्रेड उप-डोमेन हल के लिए 2 धागे का उपयोग करेगा। हालांकि, मुझे यकीन नहीं है कि ओपनएमपी का उपयोग करके, कोई थ्रेड के पूल का प्रबंधन करेगा- क्या लूप के लिए ओपनएमपी में धागे की संख्या को सीमित करना संभव है? क्या यह बहु-स्तर समांतरता कुछ है जो अभ्यास में समझ में आता है? (समाप्त करने के लिए सभी तरह से पढ़ने के लिए और धन्यवाद!) क्या मैं यहाँ प्रस्तावित किए हैं सराहना की होगी पर कोई अन्य विचार
आप किस सॉल्वर का उपयोग कर समाप्त कर चुके हैं? – Jacob
@ जैकब- जिस प्रणाली को मैं हल कर रहा हूं, उसके कई अलग-अलग प्रकार के उप-डोमेन हैं जो सीआरएस पर एक जैकोबी-पूर्वनिर्धारित जीएमआरईएस का उपयोग करके सबसे अधिक कुशलतापूर्वक हल किए जाते हैं, आईसीसी पूर्व शर्त सीजी को सीडीएस पर हल करते हैं, या सीधे घने हल होते हैं। प्रत्येक उप-डोमेन से अधिक लाभ प्राप्त करने के लिए, मैंने 1-चरणीय गैर-ओवरलैपिंग योजक श्वार्ज़ प्रीकंडिशनर का उपयोग करके वैश्विक प्रणाली पर जीएमआरईएस के साथ समाप्त किया, जहां पूर्वोत्तर में स्थानीय हल करने के लिए उपयुक्त सॉल्वर एल्गोरिदम है उप-डोमेन प्रकार। – MarkD
क्या आपने सोचा है कि आप कुछ हद तक बड़े सिस्टम को हल करना चाहते हैं या उन समाधानों को तेज़ी से चाहते हैं?ओपनएमपी एकल साझा-मेमोरी नोड्स के लिए बहुत अच्छा है, लेकिन जैसे ही आप इसे पहले दबाते हैं (आकार के कारणों के लिए या बस थोड़े समय में गणना करना), आप कुछ और चाहते हैं, जो स्केल कर सकते हैं। मैं सुझाव देता हूं कि मेरी प्रयोगशाला विकसित होती है (प्रोफ़ाइल देखें), लेकिन आप पहले ही ओपनएमपी का उल्लेख कर चुके हैं क्योंकि एक सीधी सीखने की वक्र है। हमारा सॉफ़्टवेयर दुखद रूप से अभी भी खड़ा है, हालांकि इसमें कुछ संरचनाएं हैं जो चीजों को अधिक स्वाभाविक रूप से प्रस्तुत कर सकती हैं। – Novelocrat