Я пишу простой тестовый код, чтобы увидеть, как я могу обернуть код fortran, содержащий области openacc, и вызвать из python. Вот код.Использование F2Py с OpenACC дает ошибку импорта в Python
module test
use iso_c_binding, only: sp => C_FLOAT, dp => C_DOUBLE, i8 => C_INT
implicit none
contains
subroutine add (a, b, n, c)
integer(kind=i8), intent(in) :: n
real(kind=dp), intent(in) :: a(n)
real(kind=dp), intent(in) :: b(n)
real(kind=dp), intent(out) :: c(n)
integer(kind=i8) :: i
!$acc enter data create(a, b, c)
do i = 1, n
c(i) = a(i) + b(i)
end do
!$acc exit data delete(a, b, c)
end subroutine add
subroutine mult (a, b, c)
real(kind=dp), intent(in) :: a
real(kind=dp), intent(in) :: b
real(kind=dp), intent(out) :: c
c = a * b
end subroutine mult
end module test
Теперь, если я не использую openacc, он отлично работает, и я могу использовать для добавления и мульт из питона. Но после того, как я поставил область openacc, f2py компилирует его хорошо, но когда я пытаюсь импортировать в Python, я получаю следующее сообщение об ошибке
ImportError: /home/vikram/Experiments/Experiments/fortran_python/hello.cpython-35m-x86_64-linux-gnu.so: undefined symbol: GOACC_enter_exit_data
Это кажется мне сказать, что Python должен знать, как найти GOACC_enter_exit_data, я см., что GOACC_enter_exit_data находится в libgomp.so.1. Как сообщить python свой путь.
Какая у вас компиляция? Работает ли ваш f2py с программами OpenMP? –
Спасибо за комментарий. Я действительно решил эту проблему, используя команду f2py -c -m -verbose -f90flags = '- fopenacc -foffload = nvptx-none -foffload = -O3 -O3' hello hello.f90 -L/usr/local/cuda/lib64 -lcublas -lcudart -lgomp Очевидно, что lgomp был тем, чего не хватало. – Vikram
Вы должны написать это как ответ. Обычно не связывается libgomp явно. –