Я должен был сделать проект, чтобы пройти мой курс. Я хотел бы спросить, есть ли возможность сделать мой код более эффективным или просто лучше. Я делаю это, потому что мой координатор - очень тщательный перфекционист и сумасшедший об эффективности. Это гибридная программа, она изменяет растровое изображение 24bpp. Это уменьшение контрастности, алгоритм выглядит следующим образом (он утвержден моим координатором):Уменьшение контрастности - intel x86
comp-=128;
comp*=rfactor
comp/=128
comp+=128
«комп» означает, что каждый компонент пикселя, в буквальном смысле: каждое значение красного, зеленого и синего цветов в каждом пикселе. Функция выполняет именно это, я читаю из файла, используя другие функции в C. Я пересылаю сборке массив с компонентами, ширину bmp, количество пикселей в каждой строке и значение «rfactor» - уменьшение контраста. то я просто делаю это:
; void contrast(void *img, int width, int lineWidth, int rfactor);
; stack: EBP+8 -> *img
; EBP+12 -> width [px]
; EBP+16 -> lineWidth [B]
; EBP+20 -> rfactor (values in range of 1-128)
section .text
global contrast
contrast:
push ebp
mov ebp, esp
push ebx
mov ebx, [ebp+12] ; width
mov eax, [ebp+16] ; lineWidth
mul ebx ; how much pixels to reduce
mov ecx, eax ; set counter
mov edx, [ebp+8] ; edx = pointer at img
mov ebx, [ebp+20] ; ebx=rfactor
loop:
xor eax, eax
dec ecx ; decrement counter
mov al, [edx] ; current pixel to al
add eax, -128
imul bl ; pixel*rfactor
sar eax, 7 ; pixel/128
add eax, 128
mov byte[edx], al ; put the pixel back
inc edx ; next pixel
test ecx, ecx ; is counter 0?
jnz loop
koniec:
pop ebx
mov esp, ebp
pop ebp
ret
Есть ли что-нибудь для улучшения? Спасибо за все предложения, я должен произвести впечатление на моего координатора;)
Вы можете использовать расширения, такие как SSE 4.x и/или AVX? –
@ knm241 да, но я понятия не имею, как его использовать в этом случае –
Я не уверен, что стоит использовать SSE4.x/AVX, поскольку они требуют тестирования последнего процессора. Я написал эскиз кода с использованием SIMD-указаний, нужно сделать несколько тестов. Во всяком случае, какую-то микро-оптимизацию вы могли бы сделать: 1) Используйте инструкцию 'loop' вместо' jnz loop', поэтому вы можете избежать 'dec ecx'. 2) не нуль eax 3) перепишите свое уравнение из 'out = (in-128) * r/128 + 128' в' out = (in * r >> 7) + 128 - r', чтобы вы могли предварительно компилировать ' 128-r' перед циклом и упростить цикл (теперь должно быть возможно использовать 'shr', поскольку' in * r' является положительным. 4) Разверните цикл, чтобы обработать 4 пикселя за один раз, загружая их вместе. –