2017-03-20 3 views
1

Ich versuche, eine Beschleunigung für eine Python-Implementierung zu bekommen, die ich vor einiger Zeit geschrieben habe und entschied mich dafür, f2py zu verwenden. Ich teste gerade einige Sachen und denke, dass ich Hilfe brauche, damit FFTW3 funktioniert. Für einen ersten Test, schrieb ich die folgenden Subroutinen:Wie verlinke ich mit FFTW3 in f2py?

subroutine initFFT(planF, a, res, n) 
    implicit none 
    include "fftw3.f" 
    integer, INTENT(IN) :: n 
    complex(KIND=8), dimension(n) :: a, res 
    integer(KIND=8), intent(OUT) :: planF 

    call dfftw_plan_dft(planF, 1, n, a, res, FFTW_FORWARD, FFTW_MEASURE) 
end subroutine initFFT 

subroutine operation(a, res, n, planF) 
    implicit none 
    INCLUDE 'fftw3.f' 
    integer :: n 
    integer(KIND=8) :: planF 
    complex(KIND=8), dimension(n), intent(IN) :: a 
    complex(KIND=8), dimension(n), intent(OUT) :: res 

    call dfftw_execute_dft(planF, a, res) 
end subroutine operation 

Getestet habe ich diese mit einem einfachen Hauptprogramm

program test 
    implicit none 
    integer, parameter :: n = 3 
    integer(KIND=8) :: planF 
    complex(KIND=8), dimension(n) :: res, a 

    call initFFT(planF, a, res, n) 

    a = (/ 1., 1., 1./) 
    call operation(a, res, n, planF) 
end program test 

und kompiliert mit

gfortran -o ftest myFun.f90 -L/usr/lib -lfftw3 -I/usr/include 

Alles funktionierte und korrekte Ergebnisse zurückgegeben. Jetzt habe ich versucht, dies in der folgenden Art und Weise mit f2py zu verwenden:

f2py -c myFun.f90 -m modf --f90flags="-L/usr/lib -lfftw3 -I/usr/include" 

Das Problem ist, dass ich die folgende Fehlermeldung erhalten, wenn ich versuche, das erstellte Modul in Python (mit Import modf) zu importieren:

Import Error: modf.so undefined symbol: dfftw_execute_dft_

Ich habe schon einige Zeit mit Google verbracht, aber irgendwie habe ich noch nichts Nützliches gefunden. Hat jemand eine Idee, wie man das löst?

+0

BTW die dfftw * Verfahren für 'Doppel precision' Argumente definiert sind. Die hässliche "Art = 8" ist nicht garantiert kompatibel damit. –

+0

Danke, ja in der Produktion Code Ich habe es als 'Double Precision' - immer noch an das" alte "Format obwohl .. – rammelmueller

Antwort

3

Können Sie versuchen, indem Sie direkt die Flags zu f2py statt über --f90flags verwenden?

Derzeit sagen Sie dem Fortran-Compiler, wie Sie das Modul erstellen, aber f2py hat dann keine Ahnung von den Verknüpfungsschritten. Was Sie brauchen, ist, dass das letzte aufrufbare Python-Modul die Existenz von fftw kennt.

f2py -c -L/usr/lib -lfftw3 -I/usr/include -m modf myFun.f90 

Die Optionen werden vor die Fortran Dateiname angegeben, wie pro https://docs.scipy.org/doc/numpy/f2py/usage.html

+0

So einfach, aber so effektiv. Danke vielmals! – rammelmueller

Verwandte Themen