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

Вниз

Использование 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 вся ветка

Форум: "Media";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.041 c
1-1090248783
serg128
2004-07-19 18:53
2004.08.01
как в TTreeView получить родительский узел?


3-1089033398
RainKM
2004-07-05 17:16
2004.08.01
Бази Даных


1-1090231313
User_OKA
2004-07-19 14:01
2004.08.01
Горячая клавиша


14-1089402150
Baron
2004-07-09 23:42
2004.08.01
Потрепать


4-1087471753
NorthMan
2004-06-17 15:29
2004.08.01
Окно поверх панели задач





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