2016-10-26 3 views
2

간단한 테스트 코드를 작성하여 openacc 영역이 포함 된 Fortran 코드를 파이썬에서 어떻게 래핑 할 수 있는지 확인할 수 있습니다. 여기에 코드가 있습니다.OpenACC에서 F2Py를 사용하면 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를 사용하지 않으면 제대로 작동하고 파이썬에서 add와 mult를 모두 사용할 수 있습니다. 하지만, 나는 openacc 영역을 넣어 후, f2py 잘 컴파일합니다,하지만 난 파이썬으로 가져올 때, 나는 오류 이것은 파이썬이 GOACC_enter_exit_data을 찾는 방법을 알 필요가 말해 것으로 보인다

ImportError: /home/vikram/Experiments/Experiments/fortran_python/hello.cpython-35m-x86_64-linux-gnu.so: undefined symbol: GOACC_enter_exit_data 

에게 다음과 같은 얻을 GOACC_enter_exit_data가 libgomp.so.1에 있는지 확인하십시오. 어떻게 파이썬에게 경로를 알려주지?

+0

컴파일 명령은 무엇입니까? OpenMP 프로그램에서 f2py가 작동합니까? –

+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 

을 수행하는 f2py에 의해 생성 된 모듈이

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

를 사용하는 반면, 나에게

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) 

를 제공 나에게주는 실행 파일에 연결되고 있었다 libgomp

분명히
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) 

하지만, 창조 된 f2py에서 아닙니다 목적. 그래서

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

에 f2py 명령을 수정 그리고 지금은 컴파일하고 난 그 오류를받지 않고 파이썬으로 가져올 수 있습니다.

관련 문제