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