Lösung zur 11. Übung Systemprogrammierung II

Transcrição

Lösung zur 11. Übung Systemprogrammierung II
UNIVERSITÄT ULM
Fakultät für Informatik
Verteilte Systeme
Prof. Dr. Peter Schulthess
Michael Schöttner
Oliver Marquardt
Lösung zur 11. Übung zur Vorlesung
Systemprogrammierung II
int FeatureFlag()
{ _asm{
mov eax,1
CPUID
mov eax, edx}
}
__int64 rdtsc()
{ _asm{ rdtsc }
}
void matMultMMX1616(__int16 *a, __int16 *b, __int16 *c)
{ _asm
{
mov
esi, a
mov
edx, c
xor
ebx,ebx
label2:
mov
xor
edi, b
ecx, ecx
label:
movq
pmaddwd
movq
pmaddwd
paddw
movq
pmaddwd
paddw
movq
pmaddwd
paddw
movd
mov
psrlq
movd
add
add
add
inc
cmp
mm0,[esi]
mm0,[edi]
mm1,[esi+8]
mm1,[edi+8]
mm0,mm1
mm1,[esi+16]
mm1,[edi+16]
mm0, mm1
mm1,[esi+24]
mm1,[edi+24]
mm0, mm1
eax,mm0
[edx],ax
mm0,32
eax,mm0
[edx],ax
edx,2
edi, 32
ecx
ecx,16
1
jne
add
inc
cmp
jne
emms
label
esi, 32
ebx
ebx,16
label2
}
}
void matMult1616(__int16 *a, __int16 *b, __int16 *c)
{ _asm
{
mov
esi, a
mov
edx, c
xor
ebx,ebx
label2:
mov
edi, b
xor
ecx, ecx
label:
push
ebx
mov
ax,[esi]
imul
ax,[edi]
mov
bx,ax
mov
imul
add
ax,[esi+2]
ax,[edi+2]
bx,ax
mov
imul
add
ax,[esi+4]
ax,[edi+4]
bx,ax
mov
imul
add
ax,[esi+6]
ax,[edi+6]
bx,ax
mov
imul
add
ax,[esi+8]
ax,[edi+8]
bx,ax
mov
imul
add
ax,[esi+10]
ax,[edi+10]
bx,ax
mov
imul
add
ax,[esi+12]
ax,[edi+12]
bx,ax
mov
imul
add
ax,[esi+14]
ax,[edi+14]
bx,ax
mov
imul
add
ax,[esi+16]
ax,[edi+16]
bx,ax
2
mov
imul
add
ax,[esi+18]
ax,[edi+18]
bx,ax
mov
imul
add
ax,[esi+20]
ax,[edi+20]
bx,ax
mov
imul
add
ax,[esi+22]
ax,[edi+22]
bx,ax
mov
imul
add
ax,[esi+24]
ax,[edi+24]
bx,ax
mov
imul
add
ax,[esi+26]
ax,[edi+26]
bx,ax
mov
imul
add
ax,[esi+28]
ax,[edi+28]
bx,ax
mov
imul
add
mov
ax,[esi+30]
ax,[edi+30]
bx,ax
[edx],bx
pop
add
ebx
edx,2
add
inc
cmp
jne
add
inc
cmp
jne
edi, 32
ecx
ecx,16
label
esi, 32
ebx
ebx,16
label2
}
}
main()
{ __int16 a[256],b[256],c[256],x;
__int64 t;
for(x=0;x<256;x++)
{ a[x]=rand()%10; b[x]=rand()%10;
}
matMult1616(a,b,c);
t=rdtsc();
matMult1616(a,b,c);
t=rdtsc()-t;
3
printf("ohne mmx: %d\n", (int)t);
if(FeatureFlag()&0x800000)
{ matMultMMX1616(a,b,c);
t=rdtsc();
matMultMMX1616(a,b,c);
t=rdtsc()-t;
printf("mit mmx: %d\n", (int)t);
}
else
printf("mmx wird nicht Unterstützt!");
}
Takzyklen:
K6II 450:
Ohne MMX: 24254
Mit MMX:
5580
(Nur noch 23% der Laufzeit. 4,3 mal schneller)
Athlon 500:
Ohne MMX: 17088
Mit MMX:
3963
(Nur noch 23% der Laufzeit. 4,3 mal schneller)
Pentium Pro 200:
Ohne MMX: 11207
Mit MMX:
(Nur noch 23% der Laufzeit. 4,3 mal schneller)
4