के लिए # ओएमपी को अलग करके ओवरहेड में शामिल करें मैं पुस्तक पढ़ रहा हूं पीटर एस पैचेको द्वारा समांतर प्रोग्रामिंग पर एक परिचय। धारा 5.6.2 में, इसने कांटा को कम करने/ओवरहेड में शामिल होने के बारे में एक दिलचस्प चर्चा की। अजीब भी स्थानांतरण तरह एल्गोरिथ्म पर विचार करें:ओपनएमपी फोर्क को घटाएं/# एमपी 3 समानांतर और
for(phase=0; phase < n; phase++){
if(phase is even){
# pragma omp parallel for default(none) shared(n) private(i)
for(i=1; i<n; i+=2){//meat}
}
else{
# pragma omp parallel for default(none) shared(n) private(i)
for(i=1; i<n-1; i+=2){//meat}
}
}
लेखक का तर्क है ऊपर कोड कुछ हद तक उच्च कांटा है/भूमि के ऊपर में शामिल हो। क्योंकि धागे को फोर्क किया जाता है और बाहरी पाश के प्रत्येक पुनरावृत्ति में शामिल हो जाता है। इसलिए, वह निम्न संस्करण का प्रस्ताव: लेखकों के अनुसार
# pragma omp parallel default(none) shared(n) private(i, phase)
for(phase=0; phase < n; phase++){
if(phase is even){
# pragma omp for
for(i=1; i<n; i+=2){//meat}
}
else{
# pragma omp for
for(i=1; i<n-1; i+=2){//meat}
}
}
, दूसरे संस्करण कांटे बाहरी पाश शुरू होने से पहले धागे और प्रत्येक पुनरावृत्तियों के लिए धागे का पुन: उपयोग, बेहतर प्रदर्शन उपज।
हालांकि, मुझे दूसरे संस्करण की शुद्धता पर संदेह है। मेरी समझ में, #pragma omp parallel
निर्देश थ्रेड के समूह को शुरू करता है और थ्रेड को समानांतर में निम्न संरचित ब्लॉक निष्पादित करने देता है। इस मामले में, संरचित ब्लॉक पूरे बाहरी फॉर-लूप for(phase=0 ...)
होना चाहिए। तो, यह ऐसा मामला नहीं होना चाहिए जहां पूरे बाहरी पाश को चार धागे दिए जाने पर चार बार निष्पादित किया जाता है? यही है, अगर n=10
, तो 40 पुनरावृत्तियों को 4 धागे पर निष्पादित किया जाएगा। मेरी समझ में क्या गलत है? और omp parallel
(बिना के लिए) उपर्युक्त के लिए निम्न लूप के साथ कैसे खेलता है?
बहुत व्यापक उत्तर। – Neo1989
मुझे संदेह है, जैसा कि आप बताते हैं कि दूसरा संस्करण अब और अधिक कुशल नहीं होगा। खासकर यदि 'एन >> nthreads'। –
क्या आप मुझे बता सकते हैं कि कौन सा ओपनएमपी कार्यान्वयन "स्मार्ट" है ताकि प्रत्येक समांतर क्षेत्र के बाद धागे को फिर से शामिल न किया जा सके? – davide