2016-10-26 3 views
2

Я пишу простой тестовый код, чтобы увидеть, как я могу обернуть код 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 свой путь.

+0

Какая у вас компиляция? Работает ли ваш f2py с программами OpenMP? –

+0

Спасибо за комментарий. Я действительно решил эту проблему, используя команду 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

+0

Вы должны написать это как ответ. Обычно не связывается libgomp явно. –

ответ

1

Я решил проверить, какие исполняемые файлы я непосредственно создаю, компилируя ссылку. Так делают

ldd a.out 

дает мне

linux-vdso.so.1 => (0x00007ffed24a0000) 
libcublas.so.7.5 => /usr/local/cuda/lib64/libcublas.so.7.5 (0x00007f04c2d45000) 
libcudart.so.7.5 => /usr/local/cuda/lib64/libcudart.so.7.5 (0x00007f04c2ae7000) 
libgfortran.so.3 => /home//Experiments/Nvidia/OpenACC/OLCFHack15/gcc6/install/lib64/libgfortran.so.3 (0x00007f04c27c1000) 
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f04c24bb000) 
libgomp.so.1 => /home//Experiments/Nvidia/OpenACC/OLCFHack15/gcc6/install/lib64/libgomp.so.1 (0x00007f04c228d000) 
libgcc_s.so.1 => /home//Experiments/Nvidia/OpenACC/OLCFHack15/gcc6/install/lib64/libgcc_s.so.1 (0x00007f04c2077000) 
libquadmath.so.0 => /home//Experiments/Nvidia/OpenACC/OLCFHack15/gcc6/install/lib64/libquadmath.so.0 (0x00007f04c1e38000) 
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f04c1c1a000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f04c1855000) 
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f04c164d000) 
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f04c1449000) 
libstdc++.so.6 => /home//Experiments/Nvidia/OpenACC/OLCFHack15/gcc6/install/lib64/libstdc++.so.6 (0x00007f04c10c9000) 
/lib64/ld-linux-x86-64.so.2 (0x00007f04c4624000) 

в то время как модуль, созданный f2py использованием

f2py -c -m --f90flags='-fopenacc -foffload=nvptx-none -foffload=-O3 -O3 - fPIC' hello hello.f90 

дает мне

linux-vdso.so.1 => (0x00007ffeeef63000) 
libpython3.5m.so.1.0 => not found 
libgfortran.so.3 => /home//Experiments/Nvidia/OpenACC/OLCFHack15/gcc6/install/lib64/libgfortran.so.3 (0x00007f841918f000) 
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f8418e89000) 
libgcc_s.so.1 => /home//Experiments/Nvidia/OpenACC/OLCFHack15/gcc6/install/lib64/libgcc_s.so.1 (0x00007f8418c73000) 
libquadmath.so.0 => /home//Experiments/Nvidia/OpenACC/OLCFHack15/gcc6/install/lib64/libquadmath.so.0 (0x00007f8418a34000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f841866f000) 
/lib64/ld-linux-x86-64.so.2 (0x00007f84196be000) 

Очевидно libgomp был быть связан в исполняемый файл, но не в созданном f2py объект. Таким образом, я изменил f2py команду

f2py -c -m --f90flags='-fopenacc -foffload=nvptx-none -foffload=-O3 -O3 -fPIC' hello hello.f90 -L/usr/local/cuda/lib64 -lcublas -lcudart -lgomp 

И теперь он собирает и я могу импортировать в питон, не получая эту ошибку.

Смежные вопросы