Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.61 MB
Время: 0.042 c
15-1215425702
shlst
2008-07-07 14:15
2008.08.24
asm + отладка и что бы delphi-like


2-1216209485
Newss
2008-07-16 15:58
2008.08.24
сохранение рисунков


15-1215033148
Германн
2008-07-03 01:12
2008.08.24
Стоит ли серьёзно относится к исходникам, где встречается


2-1216210259
Костик
2008-07-16 16:10
2008.08.24
Как отловить событие.


10-1148989839
Andrey_Gor
2006-05-30 15:50
2008.08.24
Error: "Интерфейс не поддерживается"





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский