2011-01-07 2 views
7

मैं निम्नलिखित कोड का उपयोग कर सी ++ प्रोग्राम में एक समानांतर असर पाने के लिए कोशिश कर रहा हूँ:सी ++ OpenMP कार्यक्रम

#include<iostream> 
using namespace std; 

int main() 
{ 

#pragma omp parallel sections 
    { 
#pragma omp section 
     { 
     cout<<"Hello"; 
     cout<<" "; 
     cout<<"World"; 
     cout<<endl; 

     } 
#pragma omp section 
     { 
     cout<<"H"; 
     cout<<"ello"; 
     cout<<" W"; 
     cout<<"orld"; 
     cout<<endl; 
     } 
#pragma omp section 
     cout<<"Hello"<<" "<<"World"<<endl; 
#pragma omp section 
{  cout<<"Hello "; 
     cout<<"World"<<endl; 
} 
    } 
    return 0; 
} 

मैं इस कार्यक्रम में कई बार हो चुका था .. मैं समानांतरवाद की वजह से interleaved उत्पादन उम्मीद कर रहा था ..

हालांकि, हर बार मैं इस कार्यक्रम उत्पादन चलाने है:

Hello World 
Hello World 
Hello World 
Hello World 

मैं कुछ गलत कर रहा हूं?

धन्यवाद

+0

कितने कोर/प्रोसेसर अपने मशीन वास्तव में है? –

+0

4 कोर ... और क्या होगा यदि मैं केवल एक कोर पर प्रभाव देखना चाहता हूं? – Betamoo

+2

जब तक आपका सीपीयू हाइपरथ्रेडिंग नहीं करता है, * केवल एक कोर पर कोई प्रभाव नहीं होता है। –

उत्तर

3

कोड सही है, लेकिन interleaved उत्पादन जैसे छोटे कार्यक्रमों से प्राप्त करने के लिए कठिन हो सकता है। sleep पर कुछ कॉल डालने का प्रयास करें या आउटपुट स्टेटमेंट के बीच समान करें और कुछ फ्लशिंग करें।

(आप संकलन किया और लिंक के साथ -openmp, -fopenmp, या जो कुछ भी अपने संकलक सुनने के लिए? चाहते हैं)

+0

मैं '-openmp' के साथ संकलित कर रहा हूं ... – Betamoo

+0

नींद काम किया ... thnx – Betamoo

4

आप इस कार्यक्रम कैसे तैयार की है? ओपनएमपी सक्रिय है?

कि से

अलावा, एक बहुत सरल नमस्ते विश्व ऐसा दिखाई देता है कि आप interleaving वर्ण प्राप्त करना चाहते हैं:

int main() { 
    char const* str = "Hello world"; 
    unsigned const len = std::strlen(str); 
    #pragma omp parallel for num_threads(4) 
    for (unsigned thread = 0; thread < 4; ++thread) 
     for (unsigned i = 0; i < len; ++i) 
      std::cout << str[i] << std::endl; 
}