2011-12-22 14 views
6

मैंने गतिशील सरणी आवंटित करने के लिए forall का उपयोग करने का प्रयास किया, लेकिन gfortran को यह पसंद नहीं आया। मैंने यह भी पाया कि write कथन forall ब्लॉक में प्रतिबंधित हैं, और मुझे संदेह है कि read कथन भी हैं।फोरट्रान फॉरल प्रतिबंध

forall ब्लॉक में अन्य कार्यों/संचालन की अनुमति नहीं है?

ऑर्डर करने पर कोई फर्क नहीं पड़ता कि कभी-कभी do लूप को बदलने के अलावा यह निर्माण क्या है? मैंने सोचा कि यह कोडिंग को अधिक सुगम और सुरुचिपूर्ण बना देगा, विशेष रूप से दिखा रहा है कि संचालन का क्रम महत्वपूर्ण नहीं है, लेकिन forall के अंदर कौन से संचालन किए जा सकते हैं, यह काफी प्रतिबंधित है।

इन प्रतिबंधों के कारण क्या हैं, यानी उपयोगकर्ता को गड़बड़ करने से रोकने/रोकने के लिए क्या करते हैं? क्या forall का उपयोग करना अच्छा विचार है? यदि हां, तो किस उद्देश्य के लिए?

अभी कोड पर मैं केवल एक forall ब्लॉक पर काम कर रहा हूं, और यदि मैंने इसे do लूप में अनुवादित किया है तो यह चार नेस्टेड लूप देगा। किस तरह से बेहतर है?

उत्तर

11

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

FORALL और WHEREhere

आप कोड प्रदर्शन के बारे में चिंतित हैं, तो पर एक अच्छी चर्चा देखें, तो आप बल्कि एक अलग संकलक विचार कर सकते हैं - PGI या ifort। अपने अनुभव से, gfortran विकास के लिए उपयुक्त है, लेकिन वास्तव में एचपीसी के लिए नहीं है। आप pgf90 या ifort के साथ संकलित कोड के साथ कई बार तेजी से निष्पादन की सूचना देंगे।

+0

धन्यवाद, आपने इसे काफी स्पष्ट कर दिया है। –

6

Forall निर्माण वास्तव में बहुत ही सीमित है और यह केवल सरणी संचालन के लिए उपयोगी है। सटीक सीमाओं के लिए IBM Fortran - FORALL देखें। कम प्रतिबंधक do concurrent फोरट्रान 2008 का निर्माण है। यहां तक ​​कि read और write कथनों की अनुमति है। Intel Fortran - DO CONCURRENT और New features of Fortran 2008 देखें।

+0

हालांकि कई कंपाइलर फ़ोरट्रान 2008 का समर्थन नहीं करते हैं, हालांकि। मैं gfortran का उपयोग कर रहा हूँ, नवीनतम स्थिर संस्करण (4.6?) –

+1

Gfortran 4.6 इसका आंशिक समर्थन है http://fortranwiki.org/fortran/show/Fortran+2008+status और http://gcc.gnu.org/ onlinedocs/gfortran/Fortran-2008-status.html, जो नवीनतम gfortran में 'समवर्ती' करने के लिए समर्थन का दावा करता है। –

+0

मुझे सीखना चाहिए कि यह कैसे करें। –

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