2011-03-13 5 views
8

ओपनएमपी में बहु-आयामी शर्मनाक समांतर लूप को समानांतर करने का उचित तरीका क्या है? आयामों की संख्या संकलन-समय पर ज्ञात है, लेकिन कौन से आयाम बड़े होंगे। उनमें से कोई एक, दो, या एक लाख हो सकता है। निश्चित रूप से मैं एन omp parallel के एक एन आयामी पाश के लिए ...मल्टी-आयामी नेस्टेड ओपनएमपी लूप

विचार नहीं करना चाहती:

  • समस्या धारणात्मक सरल है। केवल बाहरी 'बड़े' लूप को समांतर करने की आवश्यकता है, लेकिन लूप आयाम संकलन-समय पर अज्ञात हैं और बदल सकते हैं।

  • गतिशील रूप से omp_set_num_threads(1) और #pragma omp for schedule(static, huge_number) सेट करना निश्चित लूप समांतरता को नो-ऑप बना देगा? क्या इसका अवांछित साइड इफेक्ट्स/ओवरहेड होगा? एक झुकाव की तरह लग रहा है।

  • OpenMP Specification (2.10, ए.38, ए.3 9) अनुरूप और गैर-अनुरूप घोंसले समांतरता के बीच अंतर बताता है, लेकिन इस समस्या का सबसे अच्छा तरीका नहीं सुझाता है।

  • लूप को पुन: क्रमबद्ध करना संभव है लेकिन इसके परिणामस्वरूप बहुत सारे कैश-मिस हो सकते हैं। अनलॉकिंग संभव है लेकिन गैर-तुच्छ। क्या कोई और तरीका है?

यहाँ मैं parallelize करना चाहते हैं क्या करना है:

for(i0=0; i0<n[0]; i0++) { 
    for(i1=0; i1<n[1]; i1++) { 
    ... 
     for(iN=0; iN<n[N]; iN++) { 
     <embarrasingly parallel operations> 
     } 
    ... 
    } 
} 

धन्यवाद!

+0

+1 एक अच्छी तरह से प्रस्तुत प्रश्न के लिए – pmg

+1

सही उत्तर प्राप्त करना सही सवाल पूछने के बारे में है। 'पाठ्यक्रम यह भी spec संदर्भ करने के लिए चोट नहीं पहुंचाता है। :) – Ricky

उत्तर

8

collapse निर्देश शायद आप जो खोज रहे हैं, here वर्णित है। यह अनिवार्य रूप से एक लूप बना देगा, जिसे तब लंबित किया गया है, और इन स्थितियों के बिल्कुल ठीक प्रकार के लिए डिज़ाइन किया गया है। तो आप करेंगे:

#pragma omp parallel for collapse(N) 
for(int i0=0; i0<n[0]; i0++) { 
    for(int i1=0; i1<n[1]; i1++) { 
    ... 
     for(int iN=0; iN<n[N]; iN++) { 
     <embarrasingly parallel operations> 
     } 
    ... 
    } 
} 

और सभी सेट हो जाएं।

+0

धन्यवाद! डांग, यह आसान है। मैंने देखा, सोचा कि यह किसी कारण से काम नहीं करेगा, फिर इसके बारे में भूल गया। हाँ। बस सही होने लगता है। और यह पतन के लिए '#omp समानांतर {#omp {#omp समानांतर {#omp के लिए {...}}}} के साथ घोंसला जैसा दिखता है। यह नहीं कि यह एक अच्छा विचार है, लेकिन यह बड़े डेटासेट पर फ़ंक्शन मूल्यांकन के लिए है इसलिए f (g (x)) पूरी तरह मान्य होना चाहिए। कोई बात नहीं धन्यवाद! – Ricky

+2

यद्यपि नोट करने के लिए दो चीजें। सबसे पहले, पतन खंड केवल ओपनएमपी वी 3.0 और ऊपर है। दूसरा, जब आप पतन खंड का उपयोग करते समय विशेष रूप से लूप पुनरावृत्ति चर को निजी रूप से नहीं बनाना चाहते हैं, तो यदि आप पतन खंड को हटाते हैं, तो आप उन्हें बेहतर रूप से उपरोक्त घोषित कर सकते हैं (सी 99 सिंटैक्स का उपयोग करके) या उन्हें एक निजी खंड में डाल दें । अन्यथा वे साझा किए जाएंगे और आपको एक समस्या होगी। – ejd

+1

जीसीसी 4.4.4 का उपयोग जो 3.0 लागू करता है। मुझे जांचने के लिए याद दिलाने के लिए धन्यवाद। और मुझे '#pragma omp समानांतर डिफ़ॉल्ट (कोई नहीं)' पसंद है, बस इतना आप लापरवाही नहीं करते हैं। इसके अलावा, एफवाईआई, सूचकांक एक सरणी तत्व नहीं हो सकता है, यानी 'int i [N] '। कंपाइलर त्रुटि। – Ricky