1

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)" でそれらを取得することはできません。

これは、さまざまなコンパイラのさまざまな派生型構造が原因である可能性があることを知っています。しかし、この種の派生型をコンパイラ間で渡す方法が本当に必要です。解決策はありますか?

ありがとうございました!

4

1 に答える 1