2012-11-13 20 views
20

क्या निम्न कोड केवल पहले (बाहरी) लूप को समानांतर करता है, या यह पूरे नेस्टेड लूप को समानांतर करता है?ओपनएमपी नेस्टेड लूप कैसे संभालता है?

#pragma omp parallel for 
    for (int i=0;i<N;i++) 
    { 
     for (int j=0;j<M;j++) 
     { 
     //do task(i,j)// 
     } 
    } 

मैं सिर्फ यकीन है कि अगर इसके बाद के संस्करण कोड के लिए-छोरों (इस प्रकार एक धागा सीधे संबंधित कार्य (i, j)) इंप्रेशन नेस्टेड parallelize जाएगा बनाना चाहते है, या यह केवल (के लिए लूप बाहरी parallelizes इस प्रकार यह सुनिश्चित करता है कि, लूप इंडेक्स i के साथ प्रत्येक पैरारलल थ्रेड के लिए, इसके आंतरिक लूप अनुक्रमिक रूप से एक थ्रेड में किया जाएगा, जो बहुत आयात है)।

उत्तर

27

आपके द्वारा लिखी गई रेखाएं केवल बाहरी पाश के समानांतर होंगी। parallelize करने के लिए दोनों तुम एक collapse खंड जोड़ने की जरूरत:

#pragma omp parallel for collapse(2) 
    for (int i=0;i<N;i++) 
    { 
     for (int j=0;j<M;j++) 
     { 
     //do task(i,j)// 
     } 
    } 

आप अधिक जानकारी के लिए OpenMP 3.1 विनिर्देशों (सेकंड 2.5.1) की जाँच कर सकते हैं।

+1

धन्यवाद, यह बहुत अच्छा है, मैं बाहरी लूप को समानांतर करना चाहता हूं जबकि आंतरिक लूप अनुक्रमिक रूप से अपना काम करता है। – user0002128

4

ओपनएमपी केवल प्रज्ञा के बगल में लूप को समानांतर करता है। यदि आप चाहते हैं तो आप आंतरिक लूप को भी समानांतर कर सकते हैं लेकिन यह स्वचालित रूप से नहीं किया जाएगा।

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