cvtsi2ss xmm4, rcx cvtsi2ss xmm5, r11 divss xmm4, xmm5
Breid ik de loop uit met het ophalen van een precalculated value, dan verwacht ik dat de innerloop langer duurt dan 5.9ms:
cvtsi2ss xmm4, rcx cvtsi2ss xmm5, r11 divss xmm4, xmm5 movss xmm4, real4 ptr [rcx*4+r10] ; precalculated value in xmm4
Maar de innerloop duurt nu nog maar 4.1ms!
Dit betekent dat de processor zelf doorheeft dat xmm4 na de divss instructie opnieuw wordt gevuld, dus skipt hij de divss instructie. Slim!
Zowel in SSE(x64 SIMD) als normale x64 blijkt een DIV zeer traag te zijn. In dit geval zorgt de enkele DIVSS-instructie voor 1.8ms vertraging in m'n innerloop. Precalculation is dus de moeite waard.
Aangezien je in SSE floating point berekeningen niet shift kunt gebruiken voor een deling, moet je erg opletten wat je doet.
Geen opmerkingen:
Een reactie posten