Script vom 11.04.2005.
for (i=2; i<=100; i++) a[i-1]=a[i]+b[i];
//Iteration nicht vektorisierbar! for (i=2; i<=100; i++) a[i+1]=a[i]+b[i];
for (i=1; i<=100; i++) for (j=2; j<=100; j++) // } -nur 1 Dimensionale Vektorbefehle möglich c[j,i]=c[j-1,i]+a[j,i]; // } -wieder Iteration, keine Vektorisierung möglich
→ äußerse und innere Schleifen tauschen (= Loop Interchange)
for (j=2; j<=100; j++) for (i=1; i<=100; i++) // } 1 Befehl nach Vektorisierung c[j,i]=c[j-1,i]+a[j,i]; // }
for (i=1; i<=100; i++) { if (a[i]>0) { c[i]=3*a[i]; } else { c[i]=10*b[i]; }
| maskierte Vektorbefehle | ||||
|---|---|---|---|---|
| a: | -5 | 6 | -8 | -9 |
| b: | -3 | -8 | 1 | 11 |
| 3*a: | -15 | 18 | -24 | -27 |
| 10*b: | -30 | -80 | 10 | 110 |
| (a>0): | 0 | 1 | 0 | 0 |
| merge: | -30 | 18 | 10 | 110 |
| MMX | 3DNow! | SSE | |
|---|---|---|---|
| Intel '97 | AMD '98 | Intel '99 | Hersteller, Jahr |
| Integer: 8, 16,32,64 | Integer + Float: 32 | Float: 32 | Zahlenformate: Breite |
| 8/4/2/1 | 2 | 4 | Vektorlänge |
| paddb1) mm3,mm1 | pfadd mm1,mm0 | addps xmm5,xmm4 | Beispiel- Befehle |