2016-05-03 9 views
2

私はこのようなホットスポットを持っています。どのような種類のベクトルがここに集まっていいのだろう...このようなコンパイラを得る方法の任意の提案? 16.0.2私のオプトレポートはここ条件コピーのSIMD命令

LOOP BEGIN at code.f(197,13) 
    remark #25084: Preprocess Loopnests: Moving Out Store [ code.f(203,13) ] 
    remark #15344: loop was not vectorized: vector dependence prevents vectorization 
    remark #15346: vector dependence: assumed FLOW dependence between irb line 201 and irb line 200 
    remark #15346: vector dependence: assumed ANTI dependence between irb line 200 and irb line 201 
    remark #15346: vector dependence: assumed ANTI dependence between irb line 200 and irb line 201 
    remark #15346: vector dependence: assumed FLOW dependence between irb line 201 and irb line 200 
    remark #25439: unrolled with remainder by 2 
    remark #25015: Estimate of max trip count of loop=1600 
    LOOP END 

のように見えるのifort使用

 do ii = 1, N 
      if (diff(ii) .le. M) then 
       i = i0 + ii - 1 
       rbuf(irb) = i 
       irb = irb + 1    
      end if 
     end do 

は小さなテストプログラムである

program vect 

integer :: ii, i0, irb 
integer, parameter :: N=32 
integer, parameter :: M=8 
integer, dimension(N) :: diff 
integer, dimension(2*N) :: rbuf 

rbuf = 0 

!only some values of diff will meet condition 
!could be random 
do ii=1, N 
    diff(ii) = ii 
end do 

!from an outer loop 
i0=1003 

!this is code for filling up a buffer for an expensive vectorized 
!subroutine with full vectors, irb < 2*N 
irb=3 

do ii = 1, N 
    if (diff(ii) .le. M) then 
     i = i0 + ii - 1 
     rbuf(irb) = i 
     irb = irb + 1    
    end if 
end do 


!check 
do ii = 1, 2*N 
    write(*,*) ii, rbuf(ii) 
end do 

end 
+1

'diff'は関数か配列​​ですか?あなたは周りに遊ぶために最小のコンパイル可能な例を作成できますか? –

+0

@AlexanderVogtに例文あり – user1984528

+2

条件に基づいていくつかの要素を除外して配列をコピーしていますか? [この質問](http://stackoverflow.com/questions/36932240/avx2-what-is-the-most-efficient-way-to-pack-left-based-on-a-mask)を参照してください。SSEとAVX2の回答(およびAVX512の回答)。ベクトル化することは可能ですが、Cコンパイラはあなたのためにそれをしません。おそらくFortranコンパイラでもないでしょう。 Cの組み込み関数と同等のものが必要になるか、Cまたはasm関数を呼び出すだけです。 –

答えて

1

ターゲットアーキテクチャに応じて、私はベクトル化コンパイラを取得することができましたディレクティブで

!CDIR$ IVDEP 
do ii = 1, N 
if (diff(ii) .le. M) then 
    i = i0 + ii - 1 
    rbuf(irb) = i 
    irb = irb + 1    
end if 
end do 

-xMIC-AVX512または-mmicは、これらのアーキテクチャのためのベクトル命令を与えます。例えばAVX2については

vpcompressd %zmm0, -4+vect_$RBUF.0.1(,%rax,4){%k1}  #29.15 c1 

、私は@Peterコルドが彼のコメントで示唆するように、1つは、組み込み関数/ ASMにリゾートを持っていると思うが、今後これを理解できるコンパイラを知って良いです。

+1

クールなコンパイラは 'vpcompressd' /' vcompressps'を使うのに十分スマートです。命令は、このユースケースのために設計されているようです。コンパイラはこのパターンを認識し、 'vcompress'を使用することができます。おそらくAVX2とBMI2を使って自動ベクトル化することを学ぶでしょう。 (シャッフルマスクを生成している私の手法は、ルックアップテーブルをまったく必要とせずにスカラーを上回り、コードサイズはそれほど大きくない。 –