Форум: "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