Nvidia GPU と Intel Xeon Phi を進化させるプロジェクトがあります。ホスト コードと GPU コードは Fortran で記述され、pgfortran によってコンパイルされます。仕事の一部を Phi にオフロードするには、ifort によってコンパイルされた共有ライブラリを作成し (静的リンクは機能しません)、コードの pgfortran 部分から共有サブルーチンを呼び出す必要があります。そうすることで、コードの pgfortran 部分から Xeon Phi と通信できる intel fortran 共有ライブラリに配列をオフロードできます。
今、コードの pgfortran 部分から ifort 共有ライブラリに割り当て可能な配列を含む派生型を渡そうとしています。いくつか問題があるようです。
簡単な例を次に示します (ここには Xeon Phi オフロード ディレクティブはありません)。
caller.f90:
program caller
type cell
integer :: id
real, allocatable :: a(:)
real, allocatable :: b(:)
real, allocatable :: c(:)
end type cell
integer :: n,i,j
type(cell) :: cl(2)
n=10
do i=1,2
allocate(cl(i)%a(n))
allocate(cl(i)%b(n))
allocate(cl(i)%c(n))
end do
do j=1, 2
do i=1, n
cl(j)%a(i)=10*j+i
cl(j)%b(i)=10*i+j
end do
end do
call offload(cl(1))
print *, cl(1)%c
end program caller
呼ばれる.f90:
subroutine offload(cl)
type cell
integer :: id
real, allocatable :: a(:)
real, allocatable :: b(:)
real, allocatable :: c(:)
end type cell
type(cell) :: cl
integer :: n
print *, cl%a(1:10)
print *, cl%b(1:10)
end subroutine offload
メイクファイル:
run: caller.o libcalled.so
pgfortran -L. caller.o -lcalled -o $@
caller.o: caller.f90
pgfortran -c caller.f90
libcalled.so: called.f90
ifort -shared -fPIC $^ -o $@
cl%a(1:10)
ここで" " に注意してください。 " (1:10)
" がなければ、何も出力されません。
このコードは最終的に の要素をcl(1)%a
出力し、配列を出力しようとした次の行でセグメンテーション違反に遭遇しましたcl(1)%b
。
cl%a(1:10)
" " を "cl%a(1:100)"に変更し、" " を削除するとprint *, cl%b(1:10)
。次の結果が得られます。
b 配列の要素がそこにあることがわかりますが、" cl%b(1:10)
" でそれらを取得することはできません。
これは、さまざまなコンパイラのさまざまな派生型構造が原因である可能性があることを知っています。しかし、この種の派生型をコンパイラ間で渡す方法が本当に必要です。解決策はありますか?
ありがとうございました!