2003-08-31, 13:36
#1
Tjohopp, jag har suttit och lekt lite med inline Assembly (inte Assembler!) i Visual C++ och kört fast i min optimering. Funktionen jag skriver på är en dummy-function som inverterar en bild. Nu har kommer jag dock inte längre med min optimering, så jag skulle vilja ha era tips.
Algoritm:
Eftersom jag vill invertera alla färgerna gäller det alltså att invertera alla element i arrayen. När jag inte behöver bry mig om vilka som ska inverteras kan jag läsa två dword (double word) per loop. Detta är för att jag ska kunna para intruktionerna.
När jag parat instruktionerna blir koden lite rörigare med jag får hoppas att in förstår ändå :-)
Nåväl jag har inga mer ideer så jag skull gärna vilja ha era tips.
Jag har hämtat ganska så mycket information om optimering från Agner Fogs guide. http://www.agner.org/assem/pentopt.zip
Här kommer koden:
Jag har säkert stavat nått engelskt ord fel...
Algoritm:
Eftersom jag vill invertera alla färgerna gäller det alltså att invertera alla element i arrayen. När jag inte behöver bry mig om vilka som ska inverteras kan jag läsa två dword (double word) per loop. Detta är för att jag ska kunna para intruktionerna.
När jag parat instruktionerna blir koden lite rörigare med jag får hoppas att in förstår ändå :-)
Nåväl jag har inga mer ideer så jag skull gärna vilja ha era tips.
Jag har hämtat ganska så mycket information om optimering från Agner Fogs guide. http://www.agner.org/assem/pentopt.zip
Här kommer koden:
Kod:
struct rgb { unsigned char red; unsigned char green; unsigned char blue; }; void InvertImage_optimized4(rgb *picture, unsigned int width, unsigned int height) { __asm { push ebx mov ebx, [picture] // check the alignment (aligned by 8) mov eax, ebx test eax, 7 jnz ready mov eax, dword ptr [width] // width imul eax, dword ptr [height] // width * height imul eax, 3 // width * height * sizeof(unsigned char) * 3 add eax, ebx // add base address mov ecx, eax jmp first_time // read two dword per loop main_loop: mov dword ptr [ebx-4], eax // U first_time: mov edx, dword ptr [ebx] // V (pairs) add ebx, 4 // U xor edx, 0FFFFFFFFh // V (pairs) mov eax, dword ptr [ebx] // U add ebx, 4 // V (pairs) xor eax, 0FFFFFFFFh // U mov dword ptr [ebx-8], edx // V (pairs) cmp ebx, ecx // U jb main_loop // V (pairs) mov dword ptr [ebx-4], eax ready: pop ebx } }
Jag har säkert stavat nått engelskt ord fel...