द्वारा संलग्न नहीं किया जाना चाहिए क्यों इंटेल कंपाइलर मुझे यह निर्दिष्ट नहीं करेगा कि ओपनएम parallel for
ब्लॉक में कुछ कार्रवाइयां केवल मास्टर थ्रेड द्वारा निष्पादित की जानी चाहिए?ओपनएमपी "मास्टर" प्रगामा को "समानांतर" प्रगामा
और मैं इस तरह की कार्यक्षमता के बिना क्या हासिल करने की कोशिश कर रहा हूं?
long num_items_computed = 0;
#pragma omp parallel for schedule (guided)
for (...a range of items...)
{
//update item count
#pragma omp atomic
num_items_computed++;
//update progress bar with number of items computed
//master thread only due to com marshalling
#pragma omp master
set_progressor_callback(num_items_computed);
//actual computation goes here
...blah...
}
मैं केवल मास्टर धागा, कॉलबैक कॉल करने के लिए है क्योंकि अगर मुझे लगता है कि लागू नहीं करना चाहती:
मुझे क्या करना कोशिश कर रहा हूँ अद्यतन प्रगति के लिए एक समानांतर में एक कॉलबैक के माध्यम से बार है (माना बजाय omp critical
का उपयोग कर केवल एक ही धागे सुनिश्चित करने के द्वारा कॉलबैक एक ही बार में उपयोग करता है) मैं निम्नलिखित क्रम अपवाद:
The application called an interface that was marshalled for a different thread.
... इसलिए मास्टर थ्रेड में सभी कॉलबैक रखने के लिए इच्छा।
अग्रिम धन्यवाद।
ऐसा लगता है कि यह काम कर रहा है, धन्यवाद। मैं चिंतित था कि मास्टर थ्रेड सभी कार्यकर्ता धागे के लिए अलग हो सकता है ... ताकि कॉलबैक कभी निष्पादित न हो ... क्या यह ओएमपी स्पेक के भीतर कल्पनाशील है? –
यदि पुनरावृत्तियों की संख्या बड़ी है तो आपको अंतर दिखाई नहीं देगा। और लूप के बाद जोड़ें: अगर (omp_get_thread_num() == 0) set_progressor_callback (num_items_computed); –
स्टैंडमा ओपनएमपी से pragma omp समानांतर के लिए(): "लूप निर्माण निर्दिष्ट करता है कि एक या अधिक संबंधित लूप के पुनरावृत्तियों को उनके अंतर्निहित कार्यों के संदर्भ में टीम में धागे द्वारा समानांतर में निष्पादित किया जाएगा।पुनरावृत्तियों को उन धागे में वितरित किया जाता है जो समानांतर क्षेत्र को निष्पादित करने वाली टीम में मौजूद हैं, जिसमें लूप क्षेत्र बांधता है। " –