Быстрый rgb565 до YUV (или даже rgb565 до Y) - PullRequest
1 голос
/ 13 января 2010

Я работаю над тем, что я хочу, чтобы у меня была опция вывода, чтобы перейти к наложению видео. Некоторая поддержка rgb565, если так мило, просто скопируйте данные.

Если нет, мне нужно скопировать данные с помощью преобразования, и это буфер кадров за раз. Я собираюсь попробовать несколько вещей, но я подумал, что это может быть одной из тех вещей, на которые оптимизаторы будут стремиться попробовать себя.

Существует множество форматов YUV, которые обычно поддерживаются проще всего: это плоскость Y, за которой следуют либо чередующиеся, либо отдельные плоскости UV.

Использование Linux / xv, но на уровне, с которым я имею дело, это всего лишь байты и x86.

Я собираюсь сосредоточиться на скорости за счет качества, но потенциально есть сотни различных путей, чтобы попробовать. Там где-то есть баланс.

Я посмотрел на mmx, но я не уверен, есть ли там что-нибудь полезное. Нет ничего, что могло бы мне показаться особенно подходящим для этой задачи, и было бы очень трудно перетаскивать вещи в нужное место в регистрах.

Попытка сырой версии с Y = Зеленый * 0,5 + R * 0,25 + Синий * не очень. U и V еще менее важны с точки зрения качества. Вы можете сойти с рук с помощью убийства на этих каналах.

Для простой петли.

loop:
movzx eax,[esi]
add esi,2
shr eax,3
shr al,1
add ah,ah
add al,ah
mov [edi],al
add edi,1
dec count
jnz loop

конечно, каждая инструкция зависит от предыдущей, и чтение слов не самое лучшее, поэтому чередование двух может получить немного

loop: 
mov eax,[esi]
add esi,4
mov ebx,eax
shr eax,3
shr ebx,19
add ah,ah
add bh,bh
add al,ah
add bl,bh
mov ah,bl
mov [edi],ax
add edi,2
dec count
jnz loop

Было бы довольно легко сделать это с 4 за раз, возможно, для выгоды.

Может кто-нибудь придумать что-нибудь быстрее, лучше?

Интересно отметить, может ли приличный компилятор создавать похожий код.

Ответы [ 2 ]

1 голос
/ 14 января 2010

Приличный компилятор, учитывая соответствующие переключатели для настройки наиболее интересующих вас вариантов CPU, почти наверняка знает гораздо больше о хорошем выборе и планировании инструкций x86, чем любой простой смертный!

Взгляните на Справочное руководство по оптимизации архитектур Intel (R) 64 и IA-32 ...

Если вы хотите войти в оптимизирующий вручную код, хорошей стратегией может быть заставить компилятор сгенерировать для вас исходный код сборки в качестве отправной точки, а затем настроить его; профиль до и после каждого изменения, чтобы убедиться, что вы действительно делаете вещи лучше.

1 голос
/ 14 января 2010

Я думаю, что вы действительно хотите посмотреть на это, используя MMX или целочисленные инструкции SSE для этого. Это позволит вам работать с несколькими пикселями одновременно. Я предполагаю, что ваш компилятор сможет генерировать такой код, если вы укажете правильные ключи, особенно если ваш код написан достаточно хорошо.

Что касается ваших существующих кодов, я бы не стал чередовать инструкции разных итераций для повышения производительности. Неупорядоченный механизм всех процессоров x86 (кроме Atom) и кешей должен справляться с этим довольно хорошо.

Редактировать: Если вам нужно добавить по горизонтали, вы можете использовать инструкции PHADDD и PHADDW. На самом деле, если у вас есть Руководство разработчика программного обеспечения Intel, вам следует искать инструкции PH*. Они могут иметь то, что вам нужно.

...