ここで他の人が表明した懐疑論のいくつかに対処するには、自分自身または他の人に証明したい人は誰でも次の方法を使用することをお勧めします。
- JMHプロジェクトを作成する
- ベクトル化可能な数学の小さなスニペットを書きます。
- -XX:-UseSuperWordと-XX:+ UseSuperWordの間でベンチマークを切り替えて実行します(デフォルト)
- パフォーマンスに違いが見られない場合、コードはおそらくベクトル化されていません
- 確認するには、アセンブリを出力するようにベンチマークを実行します。Linuxでは、perfasmプロファイラー( '-prof perfasm')を見て、期待どおりの命令が生成されるかどうかを確認できます。
例:
@Benchmark
@CompilerControl(CompilerControl.Mode.DONT_INLINE) //makes looking at assembly easier
public void inc() {
for (int i=0;i<a.length;i++)
a[i]++;// a is an int[], I benchmarked with size 32K
}
フラグありとフラグなしの結果(最近のHaswellラップトップ、Oracle JDK 8u60):-XX:+ UseSuperWord:475.073±44.579 ns / op(opsあたりのナノ秒)-XX:-UseSuperWord:3376.364±233.211 ns / op
ホットループのアセンブリはフォーマットし、ここに固執するのが少しですが、ここにスニペットがあります(hsdis.soは一部のAVX2ベクトル命令のフォーマットに失敗しているため、-XX:UseAVX = 1で実行しました):-XX:+ UseSuperWord( '-prof perfasm:intelSyntax = true'を使用)
9.15% 10.90% │││ │↗ 0x00007fc09d1ece60: vmovdqu xmm1,XMMWORD PTR [r10+r9*4+0x18]
10.63% 9.78% │││ ││ 0x00007fc09d1ece67: vpaddd xmm1,xmm1,xmm0
12.47% 12.67% │││ ││ 0x00007fc09d1ece6b: movsxd r11,r9d
8.54% 7.82% │││ ││ 0x00007fc09d1ece6e: vmovdqu xmm2,XMMWORD PTR [r10+r11*4+0x28]
│││ ││ ;*iaload
│││ ││ ; - psy.lob.saw.VectorMath::inc@17 (line 45)
10.68% 10.36% │││ ││ 0x00007fc09d1ece75: vmovdqu XMMWORD PTR [r10+r9*4+0x18],xmm1
10.65% 10.44% │││ ││ 0x00007fc09d1ece7c: vpaddd xmm1,xmm2,xmm0
10.11% 11.94% │││ ││ 0x00007fc09d1ece80: vmovdqu XMMWORD PTR [r10+r11*4+0x28],xmm1
│││ ││ ;*iastore
│││ ││ ; - psy.lob.saw.VectorMath::inc@20 (line 45)
11.19% 12.65% │││ ││ 0x00007fc09d1ece87: add r9d,0x8 ;*iinc
│││ ││ ; - psy.lob.saw.VectorMath::inc@21 (line 44)
8.38% 9.50% │││ ││ 0x00007fc09d1ece8b: cmp r9d,ecx
│││ │╰ 0x00007fc09d1ece8e: jl 0x00007fc09d1ece60 ;*if_icmpge
お城を襲撃して楽しんでください!
-XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:+LogCompilation
です。ベクトル化可能なメソッドを「ホット」にするのに十分な回数実行するプログラムが必要です。