Slide 55
Slide 55 text
Clang vs MSVC – 複雑なループ比較 -
Clang11 MSVC16.4.2
演算意図がSIMDで拾い上げられている☺
vmovss xmm4,dword ptr [r8+r11+9804h]
vmovss xmm5,dword ptr [r8+r11+9808h]
vmovss xmm6,dword ptr [r8+r11+980Ch]
vmovss xmm7,dword ptr [r8+r11+9810h]
vmovss xmm8,dword ptr [r8+r11+9814h]
vmovss xmm9,dword ptr [r8+r11+9818h]
vmovss xmm10,dword ptr [r8+r11+981Ch]
lea edx,[r10*4]
mov ecx,r14d
vmovss xmm14,dword ptr [r11+rdx*4+0D800h]
lea eax,[rdx+3]
vmovss xmm13,dword ptr [r11+rax*4+0D800h]
lea eax,[rdx+1]
vmovss xmm12,dword ptr [r11+rax*4+0D800h]
vmulss xmm1,xmm12,dword ptr [r8+r11+6800h]
lea eax,[rdx+2]
vmovss xmm11,dword ptr [r11+rax*4+0D800h]
vmulss xmm0,xmm11,dword ptr [r8+r11+7800h]
vaddss xmm3,xmm1,xmm0
vmulss xmm1,xmm14,dword ptr [r8+r11+5800h]
vaddss xmm2,xmm1,xmm13
vmulss xmm1,xmm11,dword ptr [r8+r11+7804h]
vaddss xmm0,xmm3,xmm2
vcomiss xmm0,dword ptr [r8+r11+9800h]
vmulss xmm2,xmm12,dword ptr [r8+r11+6804h]
vaddss xmm3,xmm2,xmm1
vxorps xmm0,xmm0,xmm0
vmovd eax,xmm15
cmovb ecx,eax
mov eax,ecx
スカラー演算になって命令数が画面に収まらない程に大幅に増加。
複雑になるとベクトル化を早い段階で諦めてしまう模様
vbroadcastss ymm5,dword ptr [rcx+rbx-0Ch]
vbroadcastss ymm6,dword ptr [rcx+rbx]
vbroadcastss ymm7,dword ptr [rcx+rbx-8]
vbroadcastss ymm8,dword ptr [rcx+rbx-4]
vfmadd132ps ymm5,ymm6,ymmword ptr [rsp+1C0h]
vfmadd231ps ymm5,ymm7,ymmword ptr [rsp+180h]
vfmadd231ps ymm5,ymm8,ymmword ptr [rsp+140h]
vcmpltps ymm5,ymm5,ymmword ptr [rsp+100h]
vandps ymm4,ymm5,ymm4
mov ecx,r14d
vcvtsi2ss xmm0,xmm0,rax
vmovss dword ptr [r8+r11+9800h],xmm0
vmulss xmm0,xmm14,dword ptr [r8+r11+5804h]
vaddss xmm2,xmm0,xmm13
vaddss xmm1,xmm3,xmm2
vmulss xmm2,xmm12,dword ptr [r8+r11+6808h]
vcomiss xmm4,xmm1
vmulss xmm1,xmm11,dword ptr [r8+r11+7808h]
vaddss xmm3,xmm2,xmm1
vxorps xmm0,xmm0,xmm0
vpextrd eax,xmm15,1
cmova ecx,eax
mov eax,ecx
mov ecx,r14d
vcvtsi2ss xmm0,xmm0,rax
vmovss dword ptr [r8+r11+9804h],xmm0
vmulss xmm0,xmm14,dword ptr [r8+r11+5808h]
vaddss xmm2,xmm0,xmm13
vaddss xmm1,xmm3,xmm2
vmulss xmm2,xmm12,dword ptr [r8+r11+680Ch]
vcomiss xmm5,xmm1
vmulss xmm1,xmm11,dword ptr [r8+r11+780Ch]
vaddss xmm3,xmm2,xmm1
vxorps xmm0,xmm0,xmm0
vpextrd eax,xmm15,2
:
この例ではほぼ最善の最適化結果。
但し常時全てが意図する通りにベクトル化
されるとは限らない。
自動ベクトル化も万能ではないため過信は禁物。
55/64