Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.02.17;
Скачать: CL | DM;

Вниз

Помогите периписать маааленький кусочек на асме.   Найти похожие ветки 

 
AlexT1000   (2003-02-05 15:25) [0]

Ребята очень надо для увеличения скорости перекраски скорости .
Сам я асм уже позабыл, к сожалению

procedure TColorBalanceAction.DoRow(P: PClr32Array; W: integer);
Var i : integer ;
begin
for i :=0 to W -1 do with P[i] do begin
red := RL[red];
green := GL[green];
blue := BL[blue];
end;
end;

PClr32Array = ^TClr32Array;
TClr32Array = array [0..0] of TColor32Rec;
TColor32Rec = packed record
Blue : byte;
Green : byte;
Red : byte;
Alpha : byte;
end;

RL,GL,BL : array [Byte] of Byte;


 
MBo ©   (2003-02-05 15:32) [1]

здесь ассемблер практически не даст выигрыша


 
AlexT1000   (2003-02-05 16:14) [2]

MBo - жаль. а хотелось.
по коду дельфи они вообще не используют eax и дублируют некоторые операции
//дельфи дизасм
red := RL[red];
xor ebx,ebx
mov bl,[ecx+$02]
mov bl,[eax+ebx+$0000b4]
mov[ecx+$02],bl


я бы загнал цвет в eax и обрабатывал бы его
примерно так
MOV EAX , цвет // EaX <- Xa Xr Xg Xb
MOV EBX , EAX // EaX <- Xa Xr Xg Xb
AND EAX,$00FF00FF // EAX <- 00 Xr 00 Xb
AND EBX,$FF00FF00 // EBX <- Xa 00 Xg 00
выдели цвета и погнал думаю немного бы выиграл. мне как раз немножечко прибавить и нужно . процентов 10 было бы в самый раз
но я не помню как в регистры значения массыва загонять


 
Sha ©   (2003-02-05 16:54) [3]

Попробуй это. Вдруг заработает? :)
Вызывай PrepareColors один раз в самом начале проги. Она просто копирует цвета в массив cl.
Можно крутить чуть быстрее, но будет не так красиво.

var
cl: array[0..256*3-1] of byte;
pcl: pchar;

procedure PrepareColors;
begin;
pcl:=@cl[0];
move(bl[0],cl[0],256);
move(gl[0],cl[256],256);
move(rl[0],cl[512],256);
end;

procedure DoRowAsm(P: PClr32Array; W: integer);
asm
push ebx
xor ebx,ebx
mov ecx,pcl
shl edx,2
add edx,eax
@loop:
sub edx,4
mov bl,[edx]
mov bl,[ebx+ecx]
mov [edx],bl
mov bl,[edx+1]
mov bl,[ebx+ecx+256]
mov [edx+1],bl
mov bl,[edx+2]
mov bl,[ebx+ecx+512]
mov [edx+2],bl
cmp edx,eax
ja @loop
pop ebx
end;


 
Sha ©   (2003-02-05 19:10) [4]

Вот. Максимально ускорил. Быстрее крутить невозможно. Цикл требует всего 6 тактов CPU. Правда, ради этого пришлось чуть-чуть нарушить красоту и исправить имена твоих переменных так, чтобы они не совпадали с именами регистров процессора. Поэтому процедура PrepareColors теперь не нужна.

var
clRL,clGL,clBL : array [Byte] of Byte;
procedure DoRowAsm(P: PClr32Array; W: integer);
asm
push ebx
xor ebx,ebx
xor ecx,ecx
shl edx,2
add edx,eax
@loop:
mov cl,[eax]
mov bl,[eax+1]
mov cl,[ecx+clBL]
mov bl,[ebx+clGL]
mov [eax],cl
mov [eax+1],bl
mov cl,[eax+2]
add eax,4
mov cl,[ecx+clRL]
cmp eax,edx
mov [eax+2],cl
jb @loop
pop ebx
end;


 
AlexT1000   (2003-02-06 13:33) [5]

спасибо . сейчас попробую


 
AlexT1000   (2003-02-06 13:42) [6]


у меня выдает ошибку на этой строке

mov cl,[ecx+clBL]

operand size mismatch


 
Sha ©   (2003-02-06 15:41) [7]

У меня на D6 работает.
Попробуй mov cl,byte ptr [ecx+clBL]
В третьей строке снизу опечатка, надо mov [eax-2],cl


 
AlexT1000   (2003-02-06 17:09) [8]

У меня D5 .
mov cl,byte ptr [ecx+clBL]

пробовал уже. Accsess violation происходит.

В третьей строке снизу опечатка, надо mov [eax-2],cl
учту. спасибо


 
AlexT1000   (2003-02-06 17:13) [9]

у меня
clRL,clGL,clBL

приватные переменные класса.
это может влиять?! я не думаю, конечно, но мало ли


 
MBo ©   (2003-02-06 17:16) [10]

>это может влиять?!
Да.


 
Sha ©   (2003-02-06 17:22) [11]

2 AlexT1000 (06.02.03 17:13)
вынеси их оттуда.


 
Sha ©   (2003-02-06 17:24) [12]

я имею ввиду из класса, а не из привата.


 
AlexT1000   (2003-02-06 17:31) [13]

вынес. через эти строчки проехало. но только гдето в цикле снова
Accsess violation

вроде на mov cl,[eax]
т.e наверное выход за границы массива P


 
AlexT1000   (2003-02-06 17:38) [14]

и еще . как этот код модифицировать чтобы массивы все-аки оставались переменными класса?


 
Sha ©   (2003-02-06 17:40) [15]

не передавай W=0 и все будет нормально.
еще имеется фича :) первый параметр не указатель на массив, а адрес первого элемента. Поэтому вызов такой
DoRowAsm(@a[0], 1024);


 
Sha ©   (2003-02-06 17:41) [16]

Модифицируем. Пусть сначала задышет.


 
Sha ©   (2003-02-06 17:50) [17]

Да, надеюсь, у тебя сейчас DoRowAsm не метод класса?
Это должна быть (пока) обычная процедура.


 
AlexT1000   (2003-02-06 17:55) [18]

таки - была методом
вынес - заработала .
но что удивительно по-моему в пророста нет даже минимального .
во всяком случае визуально даже вроде медленней стало.
я конечно сейчас попробую по времени проверить на здаровенном битмапе каком -либо


 
Sha ©   (2003-02-06 18:01) [19]

2 AlexT1000 (06.02.03 17:55)
Прирост сильно зависит от типа процессора.
На Р4 - в несколько раз, на AMD-K6 может не быть никакого.


 
Sha ©   (2003-02-06 18:04) [20]

У меня даже на P4 на больших битмапах иногда почему-то конвейер простаивает.


 
AlexT1000   (2003-02-06 18:14) [21]

Да судя по всему прирост в скорости минимален.
5 в лучшем случае 10 процентов.


 
Sha ©   (2003-02-06 18:18) [22]

Процессор какой?


 
AlexT1000   (2003-02-06 18:27) [23]

игра не стоила свеч. как и говорил MBo
скорость большинства операций получилась в принципе такая-же как и у фотошопа

сильно тормозит дело перерисовка прогресса в статусбаре.
даже если его рисовать через 10 процентов

и еще ты ,как я понял , тоже обрабатываешь битмапы.
у меня сильно хромает перекраска HSL вместе три параметра (как и у фотошопы) не знаешь как это ускорить . там алгоритм страшнючия я его из GIMP выдрал .
как фотошоповцам удается так быстро HSL пересчитывать?!


 
Sha ©   (2003-02-06 18:32) [24]

Не рисуй прогресс, или рисуй с большим интервалом, или расуй его сам.

Малый прирост ОБЩЕЙ производительности может означать, что еще где-нибудь есть тормоза. Надо оптимизировать ВСЕ емкие по времени процедуры, а не только эту.

Если же именно на ней свет сошелся клином, то этот код можно оптимизировать под конкретный процессор, чтобы упростить дешифрование команд и все максимально ускорить даже на самых простеньких процах.
1. Выравниваем массивы на 256.
2. Вместо операций типа xor ebx,ebx пишем lea ebx,[clGL], а вместо mov bl,[ebx+clGL] пишем mov bl,[ebx]
3. Впридачу можно цикл развернуть, если очень надо.
4. Можно вместо вызова процедуры сделать asm-вставки, если совсем прижало.

Кардинальное решение сменить процессор.


 
AlexT1000   (2003-02-06 18:46) [25]

спасибо за советы. все это я конечно делать не буду.

Кардинальное решение сменить процессор. - это коммерческий продукт. так что ни о какой смене процессора не может идти речи.

Спасибо за помощь. ветка закрыта.



Страницы: 1 вся ветка

Текущий архив: 2003.02.17;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.021 c
14-53226
Tornado
2003-01-31 15:41
2003.02.17
Опера 7


1-52937
Pasechnik
2003-02-08 17:22
2003.02.17
Enabled=true в чужом приложение


1-52912
V-A-V
2003-02-06 12:42
2003.02.17
Символ разделитель


3-52777
Imshanya
2003-01-21 14:10
2003.02.17
Referential Integrity


14-53223
BJValentine
2003-01-31 19:50
2003.02.17
Поюзаность