2016-03-31 4 views
1

Hier ist ein einfaches ProgrammBLAS Aufruf von Funktionen

PROGRAM MAIN 
implicit none 
integer, PARAMETER :: N=10 
real*8 :: A(N) 
real*8 :: x=0.1D0 
integer :: i=1 
Do i=1,N 
A(i)=i 
end do 
call dscal(N,x, A, 1) 

x=dasum(N,A,1) 

END PROGRAM MAIN 

ich mit dem Befehl kompilieren

gfortran test.f90 -o test -O1 -I /usr/include/ -L /usr/lib -lblas 

Während ich dscal kein Problem ruft das Unterprogramm habe ich die folgende Fehlermeldung für die Funktion dasum

erhalten
test.f90:15.2: 

x=dasum(N,A,1) 
1 
Error: Function 'dasum' at (1) has no IMPLICIT type 

Soll ich eine bestimmte Datei angeben, um die BLAS-Funktionen zu definieren?

+0

Welche BLAS-Implementierung verwenden Sie? Anbieter stellen häufig Schnittstellen in Modulen für die Prozeduren bereit. – francescalus

+0

@francescalus 'libblas.so.3' ist die Bibliothek, die in der ausführbaren Datei verknüpft ist, wenn sie korrekt kompiliert wird. – Tarek

Antwort

2

Für Funktionen, müssen Sie manuell den Rückgabewert angeben (und wenn Sie vornehm fühlen, ein external optional):

real*8,external :: dasum 

Zusätzlich bitte real*8 nicht verwenden. Es ist nicht standardkonform, nicht tragbar und ziemlich verwirrend. Stattdessen verwenden Sie die kind Parameter, um die Präzision zu definieren, z.B .:

real(kind=kind(1.d0)) 

oder dergleichen. Wenn Sie ISO_Fortran_env module verwenden können, verwenden Sie die Konstanten REAL32 und REAL64.

+0

Soll ich manuell die Rückgabewerte für alle BLAS/LAPACK-Funktionen angeben, die ich verwende? Gibt es nicht eine Datei, die diese Definitionen enthält? – Tarek

+0

Im Prinzip ja. Einige Implementierungen stellen jedoch Module bereit, die Sie für diesen Zweck verwenden können. MKL bietet [include files] (https://software.intel.com/de-de/node/468384#3220B6B9-8A35-42E6-888D-8832E65C2EDB). –