2011-12-01 9 views
7

मैं OpenMP साथ काम कर रहा हूँ एक अदिश पाश के लिए नेस्ट parallelize करने के लिए एक नेस्टेड parallelize कैसे करें:सही ढंग से छोरों

double P[N][N]; 
double x=0.0,y=0.0; 

for (int i=0; i<N; i++) 
{ 
    for (int j=0; j<N; j++) 
    { 
     P[i][j]=someLongFunction(x,y); 
     y+=1; 
    } 
    x+=1; 
} 

इस पाश में महत्वपूर्ण बात यह है कि मैट्रिक्स पी दोनों अदिश में ही होना चाहिए और समानांतर संस्करणों:

मेरी संभव परीक्षणों सफल नहीं हुआ सभी ...

उत्तर

13

समस्या यहाँ है कि आप के साथ यात्रा करने के लिए यात्रा निर्भरता को शामिल किया है है:

x+=1; 
y+=1; 

इसलिए, चूंकि कोड अभी खड़ा है, यह समांतर नहीं है। ऐसा करने का प्रयास करने से गलत परिणाम मिलेंगे।

for (int i=0; i<N; i++) 
{ 
    for (int j=0; j<N; j++) 
    { 
     P[i][j]=someLongFunction((double)i, (double)N*i + j); 
    } 
} 

अब आप इस पर एक OpenMP pragma फेंक अगर यह काम करता है कोशिश करते हैं और देख सकते हैं: (जैसा कि आप शायद देख रहे हैं)

सौभाग्य से, आपके मामले में, आप सीधे इस निर्भरता को शुरू करने के बिना उन्हें गणना कर सकते हैं:

#pragma omp parallel for 
for (int i=0; i<N; i++) 
{ 
    for (int j=0; j<N; j++) 
    { 
     P[i][j]=someLongFunction((double)i, (double)N*i + j); 
    } 
} 
+0

ठीक उत्तर के लिए धन्यवाद। क्या मैं आपसे एक और सवाल पूछ सकता हूं? क्या होगा यदि मैं आंतरिक लूप से पहले हर बार वाई = 0 रीसेट करना चाहता हूं? ओपनएमपी कार्यान्वयन कैसे बदलता है? – linello

+0

फिर '(डबल) एन * i + j' से '(डबल) जे' बदलें। यहां कुंजी यह है कि मैंने लूप इंडेक्स के फ़ंक्शन के रूप में 'x' और 'y' के लिए अभिव्यक्तियां प्राप्त की हैं। यह आपको निर्भरताओं को तोड़ने देता है। – Mysticial

+0

आपके उत्तरों के लिए बहुत धन्यवाद, उन्होंने मुझे स्पष्ट किया कि लूप को ओपनएमपी समांतरता के लिए तैयार करने के लिए कैसे डिसेन्ट करें। एक आखिरी सवाल, इस कोड के सीरियल और समानांतर संस्करण मुझे विभिन्न तत्वों का एक बहुत छोटा हिस्सा क्यों देते हैं? 'के लिए (int i = 0; i <एन; i ++) \t { \t \t #pragma आदेश दिया अनुसूची (गतिशील) के लिए omp समानांतर \t (; j linello