In de help kun je vinden wat er precies gebeurt bij de membench: eerst worden alle testen 'snel' gedaan om te kijken welke het beste presteert. Daarna word er met de snelste test een volle bench uitgevoerd. als de processor dus sneller is met het binnenlepelen van data door middel van MMX instructies, dan word die test verkozen boven SSE
Ik weet trouwens niet hoe in godesnaam Sandra aan zo'n hoge scores komt. Ik doe braaf prefetchen, en ik geef aan dat het non-temporal data is (in de SSE benchmark). Hoe ik nog meer data per seconde uit het geheugen kan trekken mag Joost weten.
als iemand weet hoe dit sneller kan, dan hou ik me aanbevolen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| align 32
.innerloop: prefetchnta [esi+32] ; prefetch data
movapd xmm0, [esi]
add esi, BYTE 16
movapd xmm1, [esi]
add esi, BYTE 16
prefetchnta [esi+32] ; prefetch data
movapd xmm2, [esi]
add esi, BYTE 16
movapd xmm3, [esi]
add esi, BYTE 16
prefetchnta [esi+32] ; prefetch data
movapd xmm4, [esi]
add esi, BYTE 16
movapd xmm5, [esi]
add esi, BYTE 16
prefetchnta [esi+32] ; prefetch data
movapd xmm6, [esi]
add esi, BYTE 16
movapd xmm7, [esi]
add esi, BYTE 16
dec ecx
jnz .innerloop |
De loop verder unrollen werkt niet, adressering met offset (movapd xmm0, [esi+16] bijv.) ook niet, en ander prefetchmethoden of verder weg prefetchen heeft ook al nauwelijks effect.
Vreemd genoeg word de code zelfs langzamer als ik de afhankelijkheid van ESI eruit haal door ook de andere registers te gebruiken als pointers (dus afwisselend ESI, EDI, EAX en EDX gebruiken en de add tussen twee loads in gooien op maximale instructie-afstand)