Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.02.17;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.01 c
3-52733
Чайник
2003-01-30 10:40
2003.02.17
DBEdit и поле даты


1-52818
anbezr
2003-02-07 11:38
2003.02.17
Надо ли уничтожать TStringList


14-53269
Lancelot
2003-02-02 00:08
2003.02.17
Брюс Уиллис


1-52893
Александра
2003-02-07 18:49
2003.02.17
В чем фишка?


8-53129
Sam Stone
2002-10-30 20:38
2003.02.17
Проблема с перерисовкой





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский