ओपनएमपी में बहु-आयामी शर्मनाक समांतर लूप को समानांतर करने का उचित तरीका क्या है? आयामों की संख्या संकलन-समय पर ज्ञात है, लेकिन कौन से आयाम बड़े होंगे। उनमें से कोई एक, दो, या एक लाख हो सकता है। निश्चित रूप से मैं एन 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>
}
...
}
}
धन्यवाद!
+1 एक अच्छी तरह से प्रस्तुत प्रश्न के लिए – pmg
सही उत्तर प्राप्त करना सही सवाल पूछने के बारे में है। 'पाठ्यक्रम यह भी spec संदर्भ करने के लिए चोट नहीं पहुंचाता है। :) – Ricky