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

Вниз

Использование MMX в Delphi   Найти похожие ветки 

 
Sapersky ©   (2004-05-18 10:39) [0]

Откопал в библиотеке AviSynth 2.5 (www.avisynth.org) процедуру перевода RGB в YUV. MMX, спаривание инструкций, все дела, а работает оно в лучшем случае с такой же скоростью, как паскалевский вариант, а бывает что и медленнее.
Отчасти в этом "виноват" дельфийский оптимизатор, который подтягивает паскалевскую процедуру процентов на 50, хотя никаких дополнительных инструкций не использует (или не признаётся что использует :)).
Отчасти - требуемое MMX выравнивание данных на 8 (Из комментария к процедуре - "It is important that the 64bit values are 8 byte-aligned otherwise it will give a huge penalty when accessing them"). В частности, для перевода используются некоторые константы (маски и пр.). В оригинальной процедуре на C они объявлены так:

__declspec(align(8)) static const __int64 rgb_mask = 0x00ffffff00ffffff;

Тогда как в Дельфи все константы и переменные выравниваются на 4 (независимо от установки $ALIGN - оно влияет только на записи и классы). В общем, здесь уж как повезёт.
Но даже если повезло, и выравнивание получилось (исходный буфер, результирующий, размеры изображений, константы), скорость всё равно не больше, чем у паскалевского варианта. Ещё требуется какое-то выравнивание? Ну вот, в оригинальной процедуре есть строчка align 16 (ассемблер), Дельфи её не понял, пришлось закомментировать. Выравнивание кода, что ли?
Какие ещё могут быть причины?
Операции с плавающей точкой поблизости не производятся.
Процессор P3-667.


 
MBo ©   (2004-05-18 12:31) [1]

C выравниванием действительно беда ;(
Я использовал примерно такую схему:
выделяется блок памяти N+M-4 байта (для выравнивания на M байт(8,16)), и если адрес начала не кратен M, то указатель на рабочий массив ставится на ближайшее старшее, кратное M.

Кроме того, далеко не все операции на современных процессорах будут быстрее с применением MMX - несколько конвейеров все же часто делают свою работу совсем неплохо, и на первый план выходит ограничение скорости доступа к данным - как упомянутое выравнивание, так и частое обращение к разным местам (страницам) памяти. К примеру, у меня мегабайт данных принимался и обрабатывался (существенное количество арифметики) по времени примерно столько же, сколько занимала примитивная операция - построение 16-битной гистограммы типа
for i:=0 to DataSize-1 до
 Inc(HistogramArr[DataArr[i]]);


 
miek ©   (2004-05-18 16:39) [2]

Выравнивание кода - раз (тормозит на 10-20%). Слабая шина (PCI66-PCI100) - два.


 
Sapersky   (2004-05-19 15:33) [3]

Я использовал примерно такую схему:
выделяется блок памяти N+M-4 байта (для выравнивания на M байт(8,16)), и если адрес начала не кратен M, то указатель на рабочий массив ставится на ближайшее старшее, кратное M.


Ну да, я в общем так и полагал... пытался сделать, но получается что-то не то... ассемблер знаю слабо :(
Не можете ли указать, правильно делаю или нет (вопрос из разряда RTFM, конечно... но).  Заменил

movq mm3, [rgb_mask]

на

movq mm3, qword ptr [prgb_mask]

prgb_mask - выровненный указатель на соотв. константу. Переставил байты у констант - данные же вроде хранятся в памяти в обратном порядке? Всё равно не получается.

на первый план выходит ограничение скорости доступа к данным - как упомянутое выравнивание, так и частое обращение к разным местам (страницам) памяти.

Слабая шина (PCI66-PCI100) - два

Ну, не сказал бы, что слабая (133) - для данного процессора.
К тому же, например, процедуры блендинга с MMX из FastLIB не особо страдают от недостатка пропускной способности памяти, и даже на Celeron 500 с действительно медленной шиной дают заметный прирост. Правда, судя по тому, что лучше всего ускоряется аддитивный блендинг - за счёт использования арифметики с насыщением (не нужно проверять выход из диапазона). Видимо, в таких случаях MMX и стоит использовать. Или когда можно задействовать продвинутые команды, которые делают несколько действий сразу - умножение и сложение, ещё чего-то там...

Ну вот, для таких случаев - не подскажете, где можно достать коды MMX-операций? Искал - не нашёл... Чтобы в Delphi 5 писать, или конвертировать в коды для компиляции D5. Что-нибудь из SpriteUtils2, например :)


 
MBo ©   (2004-05-19 15:50) [4]

>где можно достать коды MMX-операций?
>Чтобы в Delphi 5 писать
Поищи эксперт
MMXASM Hiroyuki Hori


 
Sapersky   (2004-05-20 09:57) [5]

Нашёл, спасибо.



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

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

Наверх




Память: 0.48 MB
Время: 0.034 c
1-1090344661
Виталий
2004-07-20 21:31
2004.08.01
Undeclared Identifier


8-1082026445
pr
2004-04-15 14:54
2004.08.01
Еще раз по осещение в OPGL


1-1089970612
DeMoN_Astra
2004-07-16 13:36
2004.08.01
Работа с меню


1-1090359562
НовиЧок
2004-07-21 01:39
2004.08.01
Сохранение RichEdit


14-1089718920
Nick-From
2004-07-13 15:42
2004.08.01
Какие проги есть, чтобы делать печати