2012-07-04 10 views
7

मेरे पास निम्न प्रश्न है: फोरट्रान 9 0 + में आवंटन/डीलोकेट स्टेटमेंट का असली ओवरहेड क्या है? अर्थात, और कई मध्यम आकार के सरणियों की तरहफोरट्रान आवंटित/हटाए गए

do i = 1, 1000 
    allocate(tmp(20)) 
    tmp(1:20) = 1d0 
    call foo(tmp) 
    deallocate(tmp) 
end do 

, एक पाश अंदर आवंटित किए जाते हैं यह इस मामले में अधिक से अधिक आकार के आधार पर एक भी काम सरणी का आवंटन लायक है?

+1

क्या ध्यान देने योग्य बचत इस बात पर निर्भर करती है कि इसे चलाने के लिए "foo" कितना समय लगता है। क्या परिवर्तन लायक है? यह या तो राय का विषय है, या आपको अपने कंपाइलर और मशीन पर रन टाइम को मापना चाहिए। क्या परिवर्तन कोड को कम पठनीय बनाता है? यदि हां, तो क्या वह रनटाइम के मिलीसेकंड को बचाने योग्य है? सेकंड? –

उत्तर

6

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

किले 2008 में इस प्रकार की समस्या का एक अच्छा समाधान है। आप अपने चर को block के अंदर रन टाइम पर निर्धारित आकार के साथ घोषित कर सकते हैं। यह कंपाइलर को स्टैक पर चर आवंटित करने के लिए बहुत आसान बनाना चाहिए। हालांकि मैंने इसे व्यक्तिगत रूप से उपयोग नहीं किया है और मुझे यकीन नहीं है कि कौन से कंपाइलर्स इसका समर्थन करते हैं।

+0

नोट: gfortran [ब्लॉक संरचनाओं का समर्थन करता है] (http://fortranwiki.org/fortran/show/Fortran+2008+status) – max

3

ALLOCATE और DEALLOCATE का उपयोग करने का ओवरहेड सी में malloc() और free() का उपयोग कर के रूप में एक ही भूमि के ऊपर वास्तव में सबसे फोरट्रान compilers कुछ जोड़ा बहीखाता साथ malloc()/free() आसपास रैपर, सभी फोरट्रान 90 सरणियों के लिए निहित के रूप में (DE)ALLOCATE लागू है।

आमतौर पर एक बड़ी पर्याप्त स्क्रैच सरणी को प्रीलोकेट करना बेहतर होता है और लगातार आवंटन और स्मृति को मुक्त करने के बजाय इसे कसकर लूप में उपयोग करना बेहतर होता है। यह ढेर को खंडित होने से भी रोकता है जो बाद में आवंटन समस्याओं का कारण बन सकता है (बहुत दुर्लभ स्थिति लेकिन यह होता है, खासकर 32-बिट कोड के साथ)।

+0

32 बिट कोड के साथ क्यों? – Rook

+2

क्योंकि 32-बिट कोडों में केवल 2 जीबी उपयोगकर्ता वर्चुअल एड्रेस स्पेस (या ओएस एक्स पर 4 जीबी) तक पहुंच है, ढेर, ढेर और मेमोरी-मैप की गई फाइलों के बीच साझा किया गया है और बुरी तरह से खंडित ढेर के साथ साझा किया जा सकता है, बस पर्याप्त पर्याप्त जगह नहीं हो सकती है बड़े हिस्सों के आगे आवंटन प्रदान करें। –

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