Форум: "Прочее";
Текущий архив: 2008.08.24;
Скачать: [xml.tar.bz2];
ВнизЕще одна просьба провести тест Найти похожие ветки
← →
ketmar © (2008-07-09 15:33) [40]>[39] ketmar © (2008-07-09 15:33:00)
алсо, у меня svn 1.1 %-)
---
All Your Base Are Belong to Us
← →
ketmar © (2008-07-09 15:37) [41]>[37] antonn © (2008-07-09 15:29:00)
вообще-то у меня проц держит SSE и MMX2. а если аффтар ниасилил… бывает. %-)
---
All Your Base Are Belong to Us
← →
antonn © (2008-07-09 15:38) [42]кстати, падение производительности м/у "Alpha bliting (MMX)" и "Alpha bliting (a, MMX)" большой из-за того, что после вывода в регистр результа
movd eax, mm0 //в еах dword-пиксель
последний четвертый байт (альфа) вычисляется "отдельно":rol eax, 8
mov bl, byte ptr [esi+3]
cmp bl,al
jb @set_al
mov al, bl
@set_al:
ror eax, 8
как приделать это действие в ММХ - хз, сломал голову, "сравнение" в регистрах ММХ не осилил (в альфу кладется бОльшее значение из двух битмапов).
а "Alpha bliting (MMX)" этот шаг пропускает, он конечную альфу не пересчитывает. А для интерфейса выводимого через updatelayerdwindow() не очень подходит такой вариант...
← →
Zeqfreed © (2008-07-09 15:39) [43]> ketmar © (09.07.08 15:33) [40]
Я когда хотел ставить 1.1 у меня был сломанный компилятор, а потом я уже расхотел :)
> antonn © (09.07.08 15:29) [37]
А запускать неизвестную программу это ничего? :)
← →
antonn © (2008-07-09 15:41) [44]
> А запускать неизвестную программу это ничего? :)
ну... запускать - не в инет неизвестно кому передавать неизвестно что :)
тогда нужно запускать на виртуальной машине! %)
← →
shlst (2008-07-09 15:44) [45]Антон, чего там с нашими цифрами, помогают? :)
← →
Zeqfreed © (2008-07-09 15:45) [46]> antonn © (09.07.08 15:41) [44]
Тогда могу предложить сделать страничку куда надо будет отправлять текстовый файл, который бы создавала программа :)
← →
ketmar © (2008-07-09 15:49) [47]>[42] antonn © (2008-07-09 15:38:00)
>jb @set_al
хинт ему не пробовал ставить?
---
Understanding is not required. Only obedience.
← →
antonn © (2008-07-09 15:54) [48]
> Антон, чего там с нашими цифрами, помогают? :)
я разочарован в атлонах, все больше :)
думаю бросить нафиг "не-ММХ" :)
хотя в общем то получается довольно шустрые функции
> Zeqfreed © (09.07.08 15:45) [46]
угу, и график еще по ним строить :)
← →
Zeqfreed © (2008-07-09 15:59) [49]> antonn © (09.07.08 15:54) [48]
Без графиков никуда, тогда те, кто заслал результаты, будут видеть, что их труды не пропадают даром ;)
← →
ketmar © (2008-07-09 16:02) [50]>[49] Zeqfreed © (2008-07-09 15:59:00)
причём вполне можно строить график рандомом, всё равно никто проверять не будет. %-)
---
Understanding is not required. Only obedience.
← →
antonn © (2008-07-09 16:03) [51]
> причём вполне можно строить график рандомом, всё равно никто
> проверять не будет. %-)
>
да мне надо было не сами значения результатов, а падение производительности м/у разными тестами
← →
Sapersky (2008-07-09 16:07) [52]нехило так рисовать картинку с альфаканалом размерами 512*512 под тысячу раз в секунду :)
Помнится, автор SpriteUtils при создании софтверного рендера упёрся в невозможность синхронизации вывода на экран с вертикальной развёрткой. В быстрых скроллерах артефакты от несинхронного вывода оказались сильно заметны. Пришлось ему изобретать какую-то гибридную с DDraw схему, не помню, насколько хорошо она работала.
а где та темка, я гляну.
http://sapersky.narod.ru/files/antonn_graphics.rar
Впрочем, что-то я засомневался в правильности работы своих функций.
Похоже, что обычная формула блендинга:
ia := (255 - a);
dc.b := (sc.b * a + dc.b * ia) shr 8;
dc.g := (sc.g * a + dc.g * ia) shr 8;
dc.r := (sc.r * a + dc.r * ia) shr 8;
даёт не вполне корректный результат (макс. 255 * 255 / 256 = 254).
Заметно, если не проверять if (a <> 0)... А проверять в MMX-варианте нежелательно, на "плохих" данных это сильно его тормозит.
появилась бы MMX2, работало бы еще быстрее
оно таки появилось, см. [23]
Ага, если код с потоками не дружит :)
Где-то читал, что у CoreDuo "производительность на Мгц" должна быть почти в 2 раза выше чем у P4, и вроде бы исключительно в силу архитектуры, без учёта двухъядерности. Хотя, может, и с учётом, не помню точно.
← →
atruhin1 (2008-07-09 16:16) [53]CPU: AMD Athlon(tm) 64 X2 Dual Core Processor 5600+
===================
Copy bliting: -40388.85
Transparent bliting: 1593.33
Opacity bliting (MMX): 616.19
Alpha bliting: 433.86
Alpha bliting (a): 414.19
Alpha bliting (MMX): 759.74
Alpha bliting (a, MMX): 627.18
Rotate: 253.91
Rotate opacity: 184.24
Rotate alpha: 181.69
Rotate alpha colorized: 184.18
Resize (proportional): 3614.52
Resize: 1843.23
Draw Scene: bump maping: 189.11
Draw Scene: reflective + bump maping: 171.59
Draw Scene: sharpen: 34.26
← →
antonn © (2008-07-09 16:45) [54]
> Помнится, автор SpriteUtils при создании софтверного рендера
> упёрся в невозможность синхронизации вывода на экран с вертикальной
> развёрткой. В быстрых скроллерах артефакты от несинхронного
> вывода оказались сильно заметны. Пришлось ему изобретать
> какую-то гибридную с DDraw схему, не помню, насколько хорошо
> она работала.
угу, знаем, именно его код и был сильно замучен и изучен :) у него, имхо, гораздо более понятно сделано, чем FastLib. Но я то не собираюсь выводить 1000 кадров, я обычно ограничиваю вывод 30ю кадрами, будет "пустое время" - пусть проц отдохнет, мне не жалко :)
← →
Test (2008-07-09 17:00) [55]CPU: AMD Athlon(tm) 64 X2 Dual Core Processor 4400+
===================
Copy bliting: 1345.70
Transparent bliting: 1215.26
Opacity bliting (MMX): 530.81
Alpha bliting: 391.63
Alpha bliting (a): 370.30
Alpha bliting (MMX): 652.69
Alpha bliting (a, MMX): 547.04
Rotate: 228.70
Rotate opacity: 168.08
Rotate alpha: 164.76
Rotate alpha colorized: 166.16
Resize (proportional): 2988.96
Resize: 1528.59
Draw Scene: bump maping: 157.81
Draw Scene: reflective + bump maping: 158.64
Draw Scene: sharpen: 30.11
← →
Sapersky (2008-07-09 17:20) [56]у него, имхо, гораздо более понятно сделано, чем FastLib.
Ага, почти чистый asm.
Кажется, что это очень круто, но на самом деле - жутко неудобно. Сам же автор как-то жаловался о сложности переделки 16-битного кода с формата 5-5-5 на 5-6-5. Да и скорости не-MMX asm вовсе не гарантирует. Компилятор, он на самом деле тоже неплохо asm знает, получше многих программистов.
У меня не-MMX вариант альфа-блендинга именно на Паскале, и он уступает MMX максимум в 1.5 раза, а не в 3.
MMX содран с той же SpriteUtils, за исключением использования pshufw (enhanced MMX) для размножения альфы.
Похоже, что обычная формула блендинга даёт не вполне корректный результат. Заметно, если не проверять if (a <> 0)...
Вру, в обычных условиях ничего не заметно. Это я пытался получить корректную картинку, прогнав 100 циклов блендинга :)
Результаты в fps у меня такие:
без проверки альфы на 0 (if a <> 0):
non-MMX 491
eMMX (SSE) 640
c проверкой, "плохие" данные (Random(255)):
non-MMX 319
eMMX (SSE) 340
c проверкой, "хорошие" данные (из набора png-иконок Висты):
non-MMX 875
eMMX (SSE) 1072
← →
Sapersky (2008-07-09 17:52) [57]Код (для FastLIB):
procedure xLine_DrawAlpha32_SSE(Src, Dst : Pointer; Count : Integer);
Const
Mask : Int64 = $000000FF00FF00FF;
asm
push esi
mov esi, eax
lea eax, [Mask]
db $0F,$6F,$28 /// movq mm5, [eax] // mm5 - $0000.00FF|00FF.00FF
db $0F,$EF,$FF /// pxor mm7, mm7 // mm7 = 0
@inner_loop:
{
mov eax, [esi]
test eax, $FF000000
jz @noblend
}
// testing the case when alpha = 0
db $0F,$6E,$06 /// movd mm0, [esi]
db $0F,$6E,$0A /// movd mm1, [edx]
db $0F,$60,$C7 /// punpcklbw mm0, mm7 // mm0 - src
db $0F,$60,$CF /// punpcklbw mm1, mm7 // mm1 - dst
db $0F,$70,$F0,$FF /// pshufw mm6, mm0, 255 // mm6 - src alpha
// db $0F,$DB,$F5 /// pand mm6, mm5
// clear alpha component of mm6 - can be skipped if not needed
db $0F,$D5,$C6 /// pmullw mm0, mm6
db $0F,$EF,$F5 /// pxor mm6, mm5
db $0F,$D5,$CE /// pmullw mm1, mm6
db $0F,$FD,$C1 /// paddw mm0, mm1
db $0F,$71,$D0,$08 /// psrlw mm0, 8
db $0F,$67,$C7 /// packuswb mm0, mm7
db $0F,$7E,$02 /// movd [edx], mm0
@noblend:
add esi, 4
add edx, 4
dec ecx
jnz @inner_loop
db $0F,$77 /// emms
pop esi
end;
procedure FDIB_DrawAlpha(Src, Dst : TFastDIB; dx, dy : Integer);
Type
TMMXAlphaProc = procedure (Src, Dst : Pointer; Count : Integer);
var
x, y, a, ia: Integer;
sc, dc: PFColorA;
MMXProc : TMMXAlphaProc;
begin
MMXProc := nil;
With CPUInfo do
If (cfSSE in Features) then MMXProc := xLine_DrawAlpha32_SSE;
else If (cfMMX in Features) then MMXProc := xLine_DrawAlpha32_MMX;
// строго говоря, для eMMX не обязательно наличие SSE (напр. 1-е Athlon)
// но как это проверить - я не в курсе
// xLine_DrawAlpha32_MMX - копия SpriteUtils, ничего интересного
for y:=0 to Src.AbsHeight-1 do begin
sc := Src.Scanlines[y];
dc := Dst.Scanlines[y + dy]; Inc(dc, dx);
If Assigned(MMXProc) then MMXProc(sc, dc, Src.Width) else
For x:=0 to Src.Width-1 do begin
a := sc.a;
// If (a <> 0) then
begin
ia := (255 - a);
dc.b := (sc.b * a + dc.b * ia) shr 8;
dc.g := (sc.g * a + dc.g * ia) shr 8;
dc.r := (sc.r * a + dc.r * ia) shr 8;
end;
Inc(sc); Inc(dc);
end;
end;
end;
как приделать это действие в ММХ - хз, сломал голову, "сравнение" в регистрах ММХ не осилил (в альфу кладется бОльшее значение из двух битмапов).
Вроде советовал уже PMAXSW или PMAXUB из того же eMMX:
http://www.tommesani.com/SSEPrimer.html
← →
VICTOR_ (2008-07-09 18:19) [58]CPU: AMD Phenom(tm) 9600 Quad-Core Processor
===================
Copy bliting: 1687.00
Transparent bliting: 1193.45
Opacity bliting (MMX): 337.92
Alpha bliting: 185.71
Alpha bliting (a): 172.05
Alpha bliting (MMX): 370.34
Alpha bliting (a, MMX): 307.02
Rotate: 119.41
Rotate opacity: 84.55
Rotate alpha: 75.90
Rotate alpha colorized: 73.98
Resize (proportional): 1708.90
Resize: 906.75
Draw Scene: bump maping: 110.16
Draw Scene: reflective + bump maping: 106.15
Draw Scene: sharpen: 18.22
CPU: AMD Processor model unknown
===================
Copy bliting: 626.99
Transparent bliting: 1310.91
Opacity bliting (MMX): 635.61
Alpha bliting: 446.81
Alpha bliting (a): 426.19
Alpha bliting (MMX): 764.92
Alpha bliting (a, MMX): 654.96
Rotate: 260.34
Rotate opacity: 189.42
Rotate alpha: 190.01
Rotate alpha colorized: 188.68
Resize (proportional): 3343.31
Resize: 1677.34
Draw Scene: bump maping: 175.83
Draw Scene: reflective + bump maping: 179.48
Draw Scene: sharpen: 35.00
← →
VICTOR_ (2008-07-09 18:24) [59]1. AMD Phenom 9600 Quad-Core Processor, 2310 MHz
2. DualCore AMD Athlon 64 X2, 3090 MHz
← →
DeadMeat © (2008-07-09 19:06) [60]CPU: AMD Turion(tm) 64 X2 Mobile Technology TL-58
===================
Copy bliting: 476.85
Transparent bliting: 443.16
Opacity bliting (MMX): 164.20
Alpha bliting: 120.38
Alpha bliting (a): 114.01
Alpha bliting (MMX): 196.23
Alpha bliting (a, MMX): 168.42
Rotate: 73.17
Rotate opacity: 52.32
Rotate alpha: 52.07
Rotate alpha colorized: 51.99
Resize (proportional): 961.41
Resize: 513.23
Draw Scene: bump maping: 52.59
Draw Scene: reflective + bump maping: 52.33
Draw Scene: sharpen: 9.40
Ноут под вистой (не SP1) на автономном питании (на батарейке в смысле... он на ней медленней работает).
← →
Омлет (2008-07-09 19:26) [61]CPU: AMD Athlon(tm) 64 Processor 3500+
===================
Copy bliting: 981.39
Transparent bliting: 1023.83
Opacity bliting (MMX): 458.88
Alpha bliting: 336.06
Alpha bliting (a): 318.09
Alpha bliting (MMX): 556.32
Alpha bliting (a, MMX): 472.95
Rotate: 196.52
Rotate opacity: 139.50
Rotate alpha: 137.84
Rotate alpha colorized: 140.97
Resize (proportional): 2364.92
Resize: 1268.21
Draw Scene: bump maping: 128.39
Draw Scene: reflective + bump maping: 133.27
Draw Scene: sharpen: 25.52
← →
X9 © (2008-07-09 19:35) [62]CPU: AMD Athlon(tm) 64 Processor 3200+
===================
Copy bliting: 1006.32
Transparent bliting: 1030.74
Opacity bliting (MMX): 415.58
Alpha bliting: 307.81
Alpha bliting (a): 291.00
Alpha bliting (MMX): 508.92
Alpha bliting (a, MMX): 437.28
Rotate: 186.06
Rotate opacity: 130.85
Rotate alpha: 132.72
Rotate alpha colorized: 130.65
Resize (proportional): 2424.97
Resize: 1227.17
Draw Scene: bump maping: 125.97
Draw Scene: reflective + bump maping: 125.73
Draw Scene: sharpen: 23.56
← →
X9 © (2008-07-09 19:43) [63]> [48] antonn © (09.07.08 15:54)
> я разочарован в атлонах, все больше :)
> думаю бросить нафиг "не-ММХ" :)
А чего это вы в них разочарованы? Вон мой 2,0ГГц обгоняет Intel(R) Pentium(R) 4 CPU 2.40GHz. Не у всех пока ещё Коры имеются, нужно писать под то, что есть.
← →
Sapersky (2008-07-09 20:16) [64]CPU: AMD Athlon(tm) 64 X2 Dual Core Processor 5600+
===================
Copy bliting: -40388.85
От подобных "заскоков" должно помогать такое:
procedure QueryPerformanceCounter(Var Cnt : Int64);
Var Thread, OldMask : DWord;
begin
// force the thread to CPU 0 for multi-core CPU
Thread := GetCurrentThread; OldMask := SetThreadAffinityMask(Thread, 1);
// update counter frequency for CPUs with variable clock rate (Athlon64, Pentium M)
QueryPerformanceFrequency(PCFreq);
Windows.QueryPerformanceCounter(Cnt);
// restore threads
SetThreadAffinityMask(Thread, OldMask)
end;
← →
antonn © (2008-07-09 20:20) [65]странно, у меня в одном потоке все выполняется...
← →
Sapersky (2008-07-09 20:39) [66]Планировщик может перебросить поток на другое ядро, а там другое значение счётчика.
http://channel9.msdn.com/forums/TechOff/152339-QueryPerformanceCounter-AthlonX2/
← →
AFHU (2008-07-09 21:20) [67]
> странно, у меня в одном потоке все выполняется...
Не этот ли фактор повлиял на крайне слабую точность измерений?
Всего пара минут сидения с прижатым Enterом и вот такие результаты:
CPU: Intel(R) Core(TM)2 Quad CPU @ 2.40GHz
===================
Copy bliting: 5659.00
Transparent bliting: 5727.09
Opacity bliting (MMX): 1032.25
Alpha bliting: 1088.18
Alpha bliting (a): 980.68
Alpha bliting (MMX): 1252.82
...
Советую сравнить с [1]
И для многоядерных процессоров всё-таки лучше предусмотреть выполнение в несколько потоков. А тут же на деле получается не ускорение, а торможение.
← →
boa_kaa © (2008-07-09 22:04) [68]CPU: AMD Athlon(tm) XP 1700+
===================
Copy bliting: 358.36
Transparent bliting: 313.92
Opacity bliting (MMX): 259.23
Alpha bliting: 151.46
Alpha bliting (a): 139.78
Alpha bliting (MMX): 262.14
Alpha bliting (a, MMX): 242.60
Rotate: 112.71
Rotate opacity: 68.09
Rotate alpha: 67.48
Rotate alpha colorized: 68.79
Resize (proportional): 757.57
Resize: 434.14
Draw Scene: bump maping: 59.83
Draw Scene: reflective + bump maping: 59.10
Draw Scene: sharpen: 14.64
← →
Sapersky (2008-07-09 23:18) [69]Всего пара минут сидения с прижатым Enterом и вот такие результаты:
Ну от параллельно выполняемых задач "поплывут" результаты на любом процессоре, хотя на двухъядернике они должны плыть меньше. Может быть, особенности QPC на AthlonX2 влияют.
Бороться с этим следует заданием высокого приоритета процессу/потоку, а не созданием дополнительных потоков.
Страницы: 1 2 вся ветка
Форум: "Прочее";
Текущий архив: 2008.08.24;
Скачать: [xml.tar.bz2];
Память: 0.6 MB
Время: 0.039 c