2016-06-28 29 views
7

सी ++ OpenMP साथ में, वहाँpragma omp समानांतर समानांतर

#pragma omp parallel for 
for(int i=0; i<N; i++) { 
    ... 
} 

और

#pragma omp parallel 
for(int i=0; i<N; i++) { 
    ... 
} 

के बीच कोई अंतर है?

धन्यवाद!

+1

दूसरे मामले में प्रत्येक थ्रेड एक ही नौकरी (पूरे लूप के लिए) है। पहला मामला धागे के बीच काम साझा करता है ताकि प्रत्येक धागा 'एन/टी' पुनरावृत्तियों को करता है जहां' t' धागे की संख्या है। –

उत्तर

5
#pragma omp parallel 
for(int i=0; i<N; i++) { 
    ... 
} 

यह कोड एक समांतर क्षेत्र बनाता है, और प्रत्येक व्यक्तिगत थ्रेड आपके लूप में क्या निष्पादित करता है। दूसरे शब्दों में, आप लूप को विभाजित करने और केवल एक बार सभी पुनरावृत्तियों को पूरा करने के बजाय, एन थ्रेड के बजाय पूर्ण लूप एन बार करते हैं।

आप कर सकते हैं:

#pragma omp parallel 
{ 
    #pragma omp for 
    for(int i=0; i < N; ++i) 
    { 
    } 

    #pragma omp for 
    for(int i=0; i < N; ++i) 
    { 
    } 
} 

यह एक समानांतर क्षेत्र बनाएगा (उर्फ एक कांटा/में शामिल होने, जो महंगा है और इसलिए आप हर पाश के लिए यह करने के लिए नहीं करना चाहते हैं) और में एक से अधिक छोरों चलाने उस क्षेत्र के भीतर समानांतर। बस सुनिश्चित करें कि आपके पास पहले से समानांतर क्षेत्र है, तो आप #pragma omp for का उपयोग #pragma omp parrallel for के विपरीत करते हैं क्योंकि बाद वाले का अर्थ यह होगा कि आपके प्रत्येक एन थ्रेड्स लूप को करने के लिए एन और थ्रेड बनाता है।

+0

मैं देखता हूं; मुझे यही चाहिए। तो पहला विकल्प ('#pragma omp समानांतर') कुल में एनथ्रेड * एन पुनरावृत्तियों को निष्पादित करेगा, और 'vec [i] = परिणाम;' लूप के अंदर 'का कोई भी विवरण सब कुछ गड़बड़ कर देगा। –

+0

@ FranciscoJ.R.Ruiz यह सही है। यदि यह उत्तर आपका प्रश्न है, तो इसे उत्तर के रूप में चिह्नित करने के लिए स्वतंत्र महसूस करें :) – RyanP

+0

ज़रूर! बहुत बहुत धन्यवाद। –

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