2016-03-31 7 views
5

मैं मूल jacobi2d गणना के टाइल किए गए निष्पादन को निर्धारित करने के लिए openmp कार्यों का उपयोग करने की कोशिश कर रहा हूं। jacobi2d मेंओपनएमपी में निर्भरता निर्भरता निर्भरता का सम्मान नहीं कर रहा है

से एक (i, j) पर निर्भरता है

ए (i, j)
एक (i-1, जे)
ए (i + 1, जे)
ए (मैं, जे -1)
ए (i, j + 1)।

निर्भर खंड की मेरी समझ के लिए मैं निर्भरता को सही तरीके से घोषित कर रहा हूं, लेकिन कोड को निष्पादित करते समय उनका सम्मान नहीं किया जा रहा है। मैंने नीचे सरलीकृत कोड टुकड़ा कॉपी किया है। शुरुआत में मेरा अनुमान था कि कुछ टाइलों के लिए सीमाओं के बाहर सीमाएं इस समस्या का कारण बन सकती हैं, इसलिए मैंने इसे सही किया लेकिन समस्या बनी रहती है। (मैंने लंबे समय तक कोड को सही टाइल श्रेणियों के साथ कॉपी नहीं किया है क्योंकि वह हिस्सा आईएफएस का एक गुच्छा है + अधिकतम)

int n=8,tsteps=2,b=4;   //n - size of matrix, tsteps - time iterations, b - tile size or block size 

#pragma omp parallel 
{ 
#pragma omp master 
for (t=0; t<tsteps; ++t) 
    { 
    for (i=0; i<n; i+=b) 
     for (j=0; j<n; j+=b) 
     { 
     #pragma omp task firstprivate(t,i,j) depend(in:A[i-1:b+2][j-1:b+2]) depend(out:B[i:b][j:b]) 
     { 
      #pragma omp critical 
      printf("t-%d i-%d j-%d --A",t,i,j);  //Prints out time loop, i,j 
     } 
     } 
    for (i=0; i<n; i+=b) 
     for (j=0; j<n; j+=b) 
     { 
     #pragma omp task firstprivate(t,i,j) depend(in:B[i-1:b+2][j-1:b+2]) depend(out:A[i:b][j:b]) 
     { 
      #pragma omp critical 
      printf("t-%d i-%d j-%d --B",t,i,j);  //Prints out time loop, i,j 
     } 
     } 
    } 
} 
} 

तो निर्भरता की घोषणा i-1 और जे -1 और रेंज से किया जा रहा (ख +2) से शुरू के साथ विचार है कि पड़ोसी टाइल्स भी अपने वर्तमान टाइल्स गणना प्रभावित करते हैं। और इसी तरह लूप के दूसरे सेट के लिए जहां पड़ोसी टाइल्स ने मूल्यों का उपयोग करने के बाद ए में मानों को केवल ओवरराइट किया जाना चाहिए।

कोड जीसीसी 5.3 का उपयोग करके संकलित किया जा रहा है जो openmp 4.0 का समर्थन करता है।

ps: जिस तरह से सरणी रेंज ऊपर घोषित की गई है, वह प्रारंभिक स्थिति और निर्भरता ग्राफ बनाने के दौरान सूचकांक की संख्या को दर्शाती है।

संपादित करें (जुलान की टिप्पणी के आधार पर) - आंतरिक कोड को एक साधारण प्रिंट स्टेटमेंट में बदल दिया क्योंकि यह कार्य निष्पादन के क्रम को जांचने के लिए पर्याप्त होगा। आदर्श रूप से उपरोक्त मानों के लिए (क्योंकि केवल 4 टाइल्स हैं) सभी टाइल्स को पहले printf को पूरा करना चाहिए और फिर केवल दूसरे को निष्पादित करना चाहिए। लेकिन अगर आप कोड निष्पादित करते हैं तो यह ऑर्डर को मिश्रित करेगा।

+0

आप लूप पर काम साझा करने का उपयोग क्यों नहीं करते? पहले लूप में आप 'बी' से पढ़ते हैं लेकिन 'ए'' पर लिखते हैं। दूसरे लूप में आप 'ए' को लिखते हैं और 'बी' से पढ़ते हैं। तो भाग 1 पहले समानांतर में और फिर part2 समानांतर में करें। बस सुनिश्चित करें कि आप part1 और part2 के बीच धागे को सिंक करते हैं (जो तब तक निहित होना चाहिए जब तक आप 'nowait' का उपयोग नहीं करते)। –

+1

निश्चित रूप से शर्तें सभी गलत हैं? ("अगर ((ii! = 0 || ii! = n-1) || (jj! = 0 || jj! = n-1))" ii == 0 पर विचार करें, जो अभी भी 0 से निष्पादित होगा! = एन -1, लेकिन आप इसे नहीं चाहते हैं क्योंकि यह सीमाओं से बाहर निकलता है ... –

+0

@Zboson - हाँ यह भी किया जा सकता है, यह केवल कार्य का उपयोग करके आपको थोड़ा अधिक कुशल उपयोग देता है छोटे कार्य आपको उच्च समांतरता देते हैं और कम सिंक्रनाइज़ेशन की आवश्यकता होती है। @ जिम। हाँ आप सही हैं, यह कोड के साथ एक त्रुटि है। बात यह है कि निर्भरता समस्या अभी भी मौजूद है। मैंने निर्भरता और निष्पादन आदेश का उपयोग करके लूप के लिए 2 आंतरिक ii और jj से पहले एकल प्रिंट। और प्रिंट स्टेटमेंट का क्रम गलत है।मैंने इस प्रिंट को एक गंभीर प्रगति में डालने का सावधानी बरतनी है क्योंकि अन्यथा प्रिंट जंगली रूप से गलत हो सकता है। – hajmola

उत्तर

0

तो आखिरकार मैंने इस मुद्दे को समझ लिया, भले ही ओपनएमपी चश्मा कहें कि निर्भर खंड को प्रारंभिक बिंदु और सीमा के साथ कार्यान्वित किया जाना चाहिए, इसे अभी तक जीसीसी में लागू नहीं किया गया है। तो वर्तमान में यह केवल निर्भर खंड से प्रारंभिक बिंदु की तुलना करता है (निर्भर (में: ए [i-1: बी + 2] [जे -1: बी + 2])) ए [i-1] [j-1] में ये मामला।

प्रारंभ में मैं विभिन्न रिश्तेदार टाइल स्थितियों में तत्वों की तुलना कर रहा था। उदाहरण के साथ टाइल के अंतिम तत्व के साथ तुलना (0,0) तत्व, जो निर्भरता के साथ कोई संघर्ष नहीं दे रहा था और इसलिए विभिन्न कार्यों के निष्पादन के यादृच्छिक क्रम।

वर्तमान जीसीसी कार्यान्वयन खंड में प्रदान की गई सीमा के बारे में परवाह नहीं करता है।

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