2012-08-28 38 views
5

इस कार्यक्रम के साथ नकल MacOSX शेर पर Illegal instruction: 4 और ifort (IFORT) के साथ दुर्घटनाओं 12.1.0 20111011कार्यक्रम दुर्घटना सरणी के लिए ifort

program foo 
     real, pointer :: a(:,:), b(:,:) 
     allocate(a(5400, 5400)) 
     allocate(b(5400, 3600)) 
     a=1.0 
     b(:, 1:3600) = a(:, 1:3600) 

     print *, a 
     print *, b 

     deallocate(a) 
     deallocate(b) 

end program 

एक ही कार्यक्रम gfortran साथ काम करता है। मुझे कोई समस्या नहीं दिख रही है। कोई विचार ? प्रतिलिपि को अनलॉक करना और कॉलम पर स्पष्ट लूप प्रदर्शन करना दोनों कंपाइलरों में काम करता है।

ध्यान दें कि पॉइंटर के बजाय आवंटनीय के साथ मुझे कोई समस्या नहीं है।

व्यवहार वही है यदि कथन या तो मॉड्यूल के अंदर है या नहीं। मैं (IFORT) 12.1.3 20120130.

जाहिर है, कोई समस्या नहीं लिनक्स के साथ और ifort 12.1.5

होता ifort पर एक ही व्यवहार की पुष्टि मैं निम्नलिखित जोड़ने विकल्पों के साथ ढेर आकार में वृद्धि करने की कोशिश की

ifort -Wl,-stack_size,0x40000000,-stack_addr,0xf0000000 test.f90

लेकिन मुझे अभी भी वही त्रुटि मिलती है। एक ही समस्या के लिए ulimit-s बढ़ रहा है।

संपादित करें 2: मैं कुछ और डिबगिंग किया था और जाहिरा तौर पर समस्या तब होता है जब सरणी स्प्लिसिंग आपरेशन

 b(:, 1:3600) = a(:, 1:3600) 

संदेह से 16 एम डेटा के लिए करीब एक मूल्य के शामिल है।

मैं उत्पादित ऑपकोड की तुलना कर रहा हूं, लेकिन अगर इंटरमीडिएट कोड फॉर्म देखने का कोई तरीका है जो अधिक संवादात्मक है, तो मैं खुशी से इसकी सराहना करता हूं।

+0

मुझे मैक हिम तेंदुए पर 12.1.1.246 के साथ "अवैध निर्देश" भी मिलता है। मैं इंटेल फोरट्रान फोरम पर रिपोर्टिंग या बग रिपोर्ट जमा करने का सुझाव देता हूं। शायद यह 12.1.5 में तय है? –

+0

और मैक हिम तेंदुए पर इसे ifort 12.0.3 के साथ मिलता है। शायद यह बग थोड़ी देर के लिए रहा है ... – EMiller

+0

स्पष्ट रूप से, समस्या (कुछ) लिनक्स बक्से पर भी मौजूद है: CentOS 5.5 और ifort 12.1 पर कोड segfaults। –

उत्तर

1

"पॉइंटर" के बजाय "आवंटनीय" का उपयोग करें।

असली, allocatable :: एक (:, :), ख (:, :)

एक सूचक के लिए एक चल बिन्दु संख्या नियत मेरे लिए संदिग्ध लग रहा है।

+2

फोर्टन में आवंटित सूचक को संख्या निर्दिष्ट करने में कुछ भी गलत नहीं है।फ़ोट्रान पॉइंटर्स सी पॉइंटर्स की तरह नहीं हैं, और => ऑपरेटर से अलग हैं और संबंधित बिल्टिन अधिकतर आवंटित सरणी की तरह व्यवहार करते हैं। – amaurea

4

आपका प्रोग्राम सही है (हालांकि यदि आप इसे पुनर्स्थापित करने में सक्षम होने की आवश्यकता नहीं है तो मैं सूचक को आवंटित करना पसंद करूंगा)। समस्या यह है कि डिफ़ॉल्ट रूप से ifort सभी सरणी अस्थायी ढेर पर रखता है, इससे कोई फर्क नहीं पड़ता कि वे कितने बड़े हैं। और ऐसा लगता है कि आप यहां कॉपी कर रहे ऑपरेशन के लिए एक सरणी अस्थायी की आवश्यकता है। Ifort के बेवकूफ डिफ़ॉल्ट व्यवहार के आसपास काम करने के लिए, हमेशा संकलन करते समय -heap-arrays ध्वज का उपयोग करें। अर्थात।

ifort -o test test.f90 -heap-arrays 1600 

-एप-एरे के पीछे की संख्या थ्रेसहोल्ड है जहां इसे ढेर का उपयोग शुरू करना चाहिए। इसके नीचे के आकार के लिए, ढेर का उपयोग किया जाता है। मैंने यहां बहुत कम संख्या चुना है - आप शायद सुरक्षित रूप से उच्चतर का उपयोग कर सकते हैं। सिद्धांत में ढेर सरणी तेज हैं, लेकिन अंतर आमतौर पर पूरी तरह से नगण्य है। मेरी इच्छा है कि इंटेल इस व्यवहार को ठीक करेगा। इस सेटिंग के लिए हर दूसरे कंपाइलर के पास समझदार डिफ़ॉल्ट हैं।

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

  • कोई संबंधित समस्या नहीं^_^