2011-05-08 14 views
5

एक सरल कार्यक्रम में सटीक मिश्रण करने की कोशिश में साथ फोरट्रान डबल परिशुद्धता कार्यक्रम और BLAS से ddot दिनचर्या का उपयोग करें, मैं डबल परिशुद्धता टुकड़े के लिए गलत उत्पादन के साथ आ रहा हूँ ।एक सरल MKL BLAS दिनचर्या

program test 

!! adding this statement narrowed the issue down to ddot being considered real(4) 
implicit none 

integer, parameter :: dp = kind(1.0d0) 

!! The following 2 lines were added for the calls to the BLAS routines. 
!! This fixed the issue. 
real(dp), external :: ddot 
real, external :: sdot 

real, dimension(3) :: a,b 
real(dp), dimension(3) :: d,e 

integer :: i 

do i = 1,3 
    a(i) = 1.0*i 
    b(i) = 3.5*i 
    d(i) = 1.0d0*i 
    e(i) = 3.5d0*i 
end do 

write (*,200) "sdot real(4) = ", sdot(3,a,1,b,1) ! should work and return 49.0 
write (*,200) "ddot real(4) = ", ddot(3,a,1,b,1) ! should not work 

write (*,200) "sdot real(8) = ", sdot(3,d,1,e,1) ! should not work 
write (*,200) "ddot real(8) = ", ddot(3,d,1,e,1) ! should work and return 49.0 

200 format(a,f5.2) 

end program test 

मैं दोनों gfortran साथ और इस प्रकार MKL BLAS लाइब्रेरी का उपयोग कर ifort संकलन की कोशिश की है:

ifort -lmkl_intel_lp64 -lmkl_sequential -lmkl_core 

gfortran -lmkl_intel_lp64 -lmkl_sequential -lmkl_core main.f90 

उत्पादन होता है: यहाँ कोड है

sdot real(4) = 49.00 
ddot real(4) = 0.00 
sdot real(8) = 4.10 
ddot real(8) = 0.00 

मैं कैसे कर सकता है दोहरी परिशुद्धता मानों को सही ढंग से संसाधित करने के लिए डीडीओटी दिनचर्या प्राप्त करें?

साथ ही, -autodouble ध्वज (ifort) या -fdefault-वास्तविक 8 (gfortran) ध्वज जोड़ने ddot दिनचर्या काम के दोनों है, लेकिन sdot दिनचर्या असफल।

संपादित करें: मैं निहित कोई भी बयान है, और ddot और sdot कार्यों के लिए दो प्रकार के बयान गयी। प्रकार समारोह के लिए निर्दिष्ट के बिना ddot के रूप में एक सटीक वास्तविक परोक्ष टाइप किया जा रहा था कहते हैं।

उत्तर

6

मैं MKL उपयोग नहीं किया है, लेकिन शायद आप एक बयान "उपयोग" की जरूरत है ताकि संकलक कार्यों के लिए इंटरफ़ेस जानता है? या अन्यथा कार्यों की घोषणा करने के लिए। वे घोषित नहीं कर रहे हैं ताकि संकलक शायद ddot की कि वापसी संभालने है एक सटीक और बिट्स गलत व्याख्या है।

चेतावनी विकल्प चालू किया जा रहा संकलक समस्या के बारे में बताना कारण बनता है। Gfortran के साथ, कोशिश करें: -फिमप्लिटी-कोई नहीं -Wall -Wline-truncation -Wcharacter-truncation -Wururprising -Waliasing -Wimplicit-interface -Wunused-parameter -fwhole-file -fcheck = all -std = f2008 -pedantic -fbacktrace

+0

+1 चेतावनियों की वास्तव में व्यापक सूची के लिए –

+0

यह अंतर्निहित था-कोई भी चेतावनी जो मुझे समाधान में चिपकाती थी। धन्यवाद। – Shamster

2

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

इसके अलावा, आप पा सकते हैं डिबग विकल्पों में से सभी प्रकार के हैं, उदाहरण के रूप में सक्षम एमएसबी द्वारा जवाब gfortran के लिए दिखाता है।

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