Aby odnieść się do części sceptycyzmu wyrażanego przez innych, sugeruję każdemu, kto chce udowodnić sobie lub innym, skorzystanie z następującej metody:
- Utwórz projekt JMH
- Napisz mały fragment matematyki z możliwością wektoryzacji.
- Uruchom ich test porównawczy, przełączając między -XX: -UseSuperWord i -XX: + UseSuperWord (domyślnie)
- Jeśli nie zaobserwujesz żadnej różnicy w wydajności, Twój kod prawdopodobnie nie został zwektoryzowany
- Aby się upewnić, uruchom test porównawczy w taki sposób, aby wydrukował zestaw. W Linuksie możesz cieszyć się profilerem perfasm ('- prof perfasm'), rzucić okiem i zobaczyć, czy instrukcje, których oczekujesz, zostaną wygenerowane.
Przykład:
@Benchmark
@CompilerControl(CompilerControl.Mode.DONT_INLINE)
public void inc() {
for (int i=0;i<a.length;i++)
a[i]++;
}
Wynik z flagą i bez niej (na ostatnim laptopie Haswell, Oracle JDK 8u60): -XX: + UseSuperWord: 475,073 ± 44,579 ns / op (nanosekundy na operację) -XX: -UseSuperWord: 3376,364 ± 233,211 ns / op
Zespół dla pętli gorącej wymaga trochę sformatowania i przyklejenia tutaj, ale oto fragment (hsdis.so nie formatuje niektórych instrukcji wektorowych AVX2, więc uruchomiłem z -XX: UseAVX = 1): -XX: + UseSuperWord (z '-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
Baw się dobrze podczas szturmu na zamek!
-XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:+LogCompilation
. Będziesz potrzebować programu, który uruchamia metodę umożliwiającą wektoryzację wystarczająco dużo razy, aby była „gorąca”.