2011-10-05 13 views
6

द्वारा संलग्न नहीं किया जाना चाहिए क्यों इंटेल कंपाइलर मुझे यह निर्दिष्ट नहीं करेगा कि ओपनएम 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. 

... इसलिए मास्टर थ्रेड में सभी कॉलबैक रखने के लिए इच्छा।

अग्रिम धन्यवाद।

उत्तर

6
#include <omp.h> 
void f(){} 
int main() 
{ 
#pragma omp parallel for schedule (guided) 
    for (int i = 0; i < 100; ++i) 
    { 
     #pragma omp master 
     f(); 
    } 
    return 0; 
} 

कंपाइलर त्रुटि C3034 OpenMP 'मास्टर' के निर्देश सीधे निर्देश दृश्य स्टूडियो 'के लिए समानांतर' के भीतर नेस्ट नहीं किया जा सकता 2010 OpenMP 2.0

तो हो सकता है:

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 it is error 
    //#pragma omp critical it is right 
    if (omp_get_thread_num() == 0) // may be good 
     set_progressor_callback(num_items_computed); 

    //actual computation goes here 
    ...blah... 
} 
+0

ऐसा लगता है कि यह काम कर रहा है, धन्यवाद। मैं चिंतित था कि मास्टर थ्रेड सभी कार्यकर्ता धागे के लिए अलग हो सकता है ... ताकि कॉलबैक कभी निष्पादित न हो ... क्या यह ओएमपी स्पेक के भीतर कल्पनाशील है? –

+0

यदि पुनरावृत्तियों की संख्या बड़ी है तो आपको अंतर दिखाई नहीं देगा। और लूप के बाद जोड़ें: अगर (omp_get_thread_num() == 0) set_progressor_callback (num_items_computed); –

+0

स्टैंडमा ओपनएमपी से pragma omp समानांतर के लिए(): "लूप निर्माण निर्दिष्ट करता है कि एक या अधिक संबंधित लूप के पुनरावृत्तियों को उनके अंतर्निहित कार्यों के संदर्भ में टीम में धागे द्वारा समानांतर में निष्पादित किया जाएगा।पुनरावृत्तियों को उन धागे में वितरित किया जाता है जो समानांतर क्षेत्र को निष्पादित करने वाली टीम में मौजूद हैं, जिसमें लूप क्षेत्र बांधता है। " –

3

कारण है कि आपको त्रुटि मिलती है क्योंकि मास्टर थ्रेड उस समय नहीं होता है जब कोड #pragma omp master लाइन तक पहुंचता है। उदाहरण के लिए, Artyom से कोड डालें:

#include <omp.h> 
void f(){} 
int main() 
{ 
#pragma omp parallel for schedule (guided) 
    for (int i = 0; i < 100; ++i) 
    { 
     #pragma omp master 
      f(); 
    } 
    return 0; 
} 

तो कोड को संकलित हैं, निम्नलिखित हो सकता है:

के धागे कहना 0 शुरू होता है (मास्टर धागा) करते हैं। यह व्यावहारिक रूप से कहता है कि "मास्टर, कोड का निम्नलिखित भाग" कहें। यह मास्टर होने के नाते समारोह चला सकते हैं। हालांकि, क्या होता है जब थ्रेड 1 या 2 या 3, आदि कोड के उस टुकड़े तक पहुंच जाता है?

मास्टर निर्देश वर्तमान/सुन रहा है टीम जो मास्टर थ्रेड को f() निष्पादित करना है। लेकिन टीम एक एकल धागा है और कोई मास्टर मौजूद नहीं है। कार्यक्रम नहीं जानता कि उस बिंदु से क्या करना है।

और यही कारण है कि, मुझे लगता है कि मास्टर को फॉर-लूप के अंदर रहने की अनुमति नहीं है।

master directiveif (omp_get_thread_num() == 0) के साथ सबस्टिट्यूटिंग काम करता है क्योंकि अब प्रोग्राम कहता है, "यदि आप मास्टर हैं, तो ऐसा करें। अन्यथा अनदेखा करें"।

संबंधित मुद्दे