2017-08-18 16 views
3

Can sb。 Fortranでpointerallocatableのサブルーチンパラメータを渡す違いについて説明してください。私はダミーfsm引数にallocatable属性を使用している場合、それは(ちょうどCのように)ベクトル化を行いながら割り当て可能な関数パラメータと自動ベクトル化

subroutine test0(fsm, im) 
implicit none 
real, dimension(:), pointer :: fsm 
integer, intent(in) :: im 
integer i 

do i = 1,im 
    fsm(i) = fsm(i)*2 
end do 
end subroutine test0 

:以下の関数はのgfortran 7.2でないベクトル化を行い、なぜ私は理解していません。私はpointerのgfortranを使用すると、はるかに高いベクトル化コストを報告すると

gfortran -mavx -O3 -ftree-vectorize -c loops.f90 -fopt-info-vec-note 

を次のコマンドラインを使用してコンパイルします。引数がどのように渡されるか(例えば、間接、ポインタへのポインタ対値渡し)に重要な違いがありますか?これはgfortranの問題ですか?

+1

ポインタバージョンに 'contiguous'属性を追加すると、ベクトル化されますか? – francescalus

+0

愚かな、割り当て可能ではなく仮定された形状について考えました。私はフランセスカラスが正しいかもしれないと思う。仮定の形状配列 '(:)'と明示的な形状配列 '(n)'も試してみてください。同様の違いが見られるかもしれません。 –

+0

@francescalus確かに、それは:)ありがとう! – angainor

答えて

2

オブジェクトが連続している場合、コンパイラは最適化する方が良い場合があります。。ここでのベクトル化は、例えば、オブジェクトがコンパイル時に連続していることが分かっている場合に限定することができる。

allocateステートメントで割り当てられた配列は、常に連続しています。ポインタ配列である仮引数は、連続している必要はありません。ここには違いがあるようです。

ただし、配列ポインタにはcontiguous属性を指定できます。このような配列は連続しています。このポインタに対する制限は、それが連続ターゲットとのみ関連づけられたポインタである可能性があることである。

想定された形状のアレイでも同様の経験が得られます。明示的なシェイプ配列も連続しています。

関連する問題