एक सरल कार्यक्रम में सटीक मिश्रण करने की कोशिश में साथ फोरट्रान डबल परिशुद्धता कार्यक्रम और 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 के रूप में एक सटीक वास्तविक परोक्ष टाइप किया जा रहा था कहते हैं।
+1 चेतावनियों की वास्तव में व्यापक सूची के लिए –
यह अंतर्निहित था-कोई भी चेतावनी जो मुझे समाधान में चिपकाती थी। धन्यवाद। – Shamster