के भीतर ओपनएमपी सिंक्रनाइज़ेशन मेरे पास एक बड़ा लूप है जो डेटा उत्पन्न करता है। प्रत्येक पुनरावृत्ति लेता है, कहता है, 1 सेकंड और डेटा का एक हिस्सा पैदा करता है। मुझे सही क्रम में फ़ाइल में लिखे गए सभी हिस्सों की आवश्यकता है।लूप
अगर मैं सिर्फ पाश parallelize करना चाहता था, मैं इस (अत्यधिक सरल) की तरह कुछ लिख सकते हैं:
FILE* f = fopen("output.txt", "w");
omp_lock_t lock;
omp_init_lock(&lock);
int nIterations = 1000000;
#pragma omp parallel for
for(int thread=0; thread<4; thread++)
{
int a=0, b=0, c=0;
for(int n=thread; n<nIterations; n+=4)
{
int value = do_computations(&a, &b, &c);
omp_set_lock(&lock);
fprintf(f, "%d\n", value);
omp_unset_lock(&lock);
}
}
#pragma omp barrier
fclose(f);
omp_destroy_lock(&lock);
इस फ़ाइल में मेरी उत्पादन हो जाता है, लेकिन प्रविष्टियों में से आदेश की गारंटी नहीं दी जाएगी।
मैं निष्पादन को सिंक्रनाइज़ करना चाहता हूं ताकि सभी थ्रेड उनके कार्य कर सकें, फिर मास्टर थ्रेड फ़ाइल में लिखता है, और फिर धागे फिर से शुरू होते हैं। दूसरे शब्दों में, मैं कुछ इस तरह करना चाहते हैं:
#pragma omp parallel for
for(int thread=0; thread<4; thread++)
{
int a=0, b=0, c=0;
int values[4];
for(int n=thread; n<nIterations; n+=4)
{
values[n] = do_computations(&a, &b, &c);
#pragma omp barrier
if(thread == 0)
{
for(int i=0; i<4; i++)
fprintf(f, "%d\n", values[i]);
}
#pragma omp barrier
}
}
#pragma omp barrier
छोड़कर, कुछ अबोध्य कारण के लिए, इस OpenMP विनिर्देश द्वारा निषिद्ध है।
या मैं
#pragma omp parallel for
for(int thread=0; thread<4; thread++)
{
int a=0, b=0, c=0;
for(int n=thread; n<nIterations; n+=4)
{
int value = do_computations(&a, &b, &c);
#pragma omp ordered
{
fprintf(f, "%d\n", value);
}
}
}
#pragma omp barrier
fclose(f);
की कोशिश कर सकते लेकिन वह, या तो काम नहीं करेगा क्योंकि "के साथ एक पाश की एक यात्रा एक निर्माण के लिए ... एक से अधिक आदेश दिया निर्देश पर अमल नहीं करना चाहिए।"
मैं कोड को एक लूप के रूप में फिर से लिखना नहीं चाहता हूं और मैं लूप का आदान-प्रदान नहीं करना चाहता हूं।
क्या अन्य थ्रेडिंग/सिंक्रनाइज़ेशन टूल के बिना ओपनएमपी के साथ ऐसा करने का कोई साफ तरीका है?
आपके कोड को चलाने वाले आर्किटेक्चर/ऑपरेटिंग सिस्टम क्या है? – Raj
क्या आप – Raj
के समानांतर के बजाय '#pragma omp समानांतर' का उपयोग करने का प्रयास कर सकते हैं क्या 'do_computations' वास्तव में तीन' 0' पास हो गया है? मुझे लगता है कि 'do_computations' एक शुद्ध कार्य नहीं है (यानी इसका साइड इफेक्ट्स है)। यदि ऐसा है, तो 'do_computations' के दुष्प्रभाव क्या हैं? क्या होता है जब समानांतर में 'do_computations' को दो कॉल निष्पादित किए जाते हैं? मुझे बहुत संदेह है कि आप उन्हें समानांतर में निष्पादित करने के साथ भी दूर हो सकते हैं (इस धारणा के आधार पर कि साइड इफेक्ट्स हैं, और इसलिए आदेश जिसमें निष्पादन * मामलों * होते हैं)। - या आप कोड को overimplifying कर रहे हैं? हो सकता है कि आपको कुछ ऐसा साझा करना चाहिए जो आपके वास्तविक पाश को बेहतर ढंग से प्रदर्शित करता हो? – ArjunShankar