私はこのようなホットスポットを持っています。どのような種類のベクトルがここに集まっていいのだろう...このようなコンパイラを得る方法の任意の提案? 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
'diff'は関数か配列ですか?あなたは周りに遊ぶために最小のコンパイル可能な例を作成できますか? –
@AlexanderVogtに例文あり – user1984528
条件に基づいていくつかの要素を除外して配列をコピーしていますか? [この質問](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関数を呼び出すだけです。 –