सी ++ OpenMP साथ में, वहाँpragma omp समानांतर समानांतर
#pragma omp parallel for
for(int i=0; i<N; i++) {
...
}
और
#pragma omp parallel
for(int i=0; i<N; i++) {
...
}
के बीच कोई अंतर है?
धन्यवाद!
सी ++ OpenMP साथ में, वहाँpragma omp समानांतर समानांतर
#pragma omp parallel for
for(int i=0; i<N; i++) {
...
}
और
#pragma omp parallel
for(int i=0; i<N; i++) {
...
}
के बीच कोई अंतर है?
धन्यवाद!
#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
के विपरीत करते हैं क्योंकि बाद वाले का अर्थ यह होगा कि आपके प्रत्येक एन थ्रेड्स लूप को करने के लिए एन और थ्रेड बनाता है।
मैं देखता हूं; मुझे यही चाहिए। तो पहला विकल्प ('#pragma omp समानांतर') कुल में एनथ्रेड * एन पुनरावृत्तियों को निष्पादित करेगा, और 'vec [i] = परिणाम;' लूप के अंदर 'का कोई भी विवरण सब कुछ गड़बड़ कर देगा। –
@ FranciscoJ.R.Ruiz यह सही है। यदि यह उत्तर आपका प्रश्न है, तो इसे उत्तर के रूप में चिह्नित करने के लिए स्वतंत्र महसूस करें :) – RyanP
ज़रूर! बहुत बहुत धन्यवाद। –
दूसरे मामले में प्रत्येक थ्रेड एक ही नौकरी (पूरे लूप के लिए) है। पहला मामला धागे के बीच काम साझा करता है ताकि प्रत्येक धागा 'एन/टी' पुनरावृत्तियों को करता है जहां' t' धागे की संख्या है। –