оптимизация asm / neon руки для обработки изображений - PullRequest
0 голосов
/ 09 августа 2011

В настоящее время я работаю над приложением рисования на ios.

Я использую непосредственное рисование в буфер NSMutableData и применяю смешивание с моей кистью следующим образом:

- (void) combineColorDestination:(unsigned char*) dest source:(unsigned char*) src
{

const unsigned char sra     = ((unsigned char *)src)[3];
const float oneminusalpha   = 1.0f - (sra / 255.f);

int d[4];

for (int i=0;i<4;i++)
{
    d[i] = oneminusalpha * ((unsigned char *)dest)[i] +  ((unsigned char *)src)[i];

    if (d[i]>255)
        d[i] = 255;

    ((unsigned char *)dest)[i] = (unsigned char)d[i];
}

}

Есть предложения по оптимизации?

Ранее я пытался использовать неон, но я получил ошибку, которую не смог исправить (граничные пиксели были глючными)

Я перебирал пиксели 2 на 2 так:

uint8x8_t va = vld1_u8(dest);
uint8x8_t vb = vld1_u8(src);
uint8x8_t res = vqadd_u8(va,vb);
vst1_u8(dest, res);

1 Ответ

2 голосов
/ 01 октября 2011

Предложения? Хорошо. Обратите внимание, что они действительны независимо от того, какие манипуляции с мультимедиа вы делаете, и вряд ли ограничены вашим делом.

Во-первых, прежде чем вы даже сделаете NEON, вы должны изменить свой код, чтобы иметь одну функцию, которая изменяет сразу несколько пикселей (по крайней мере, строку, прямоугольник, если вы можете) вместо функции (или метода - даже хуже), который меняет один пиксель и вызывается несколько раз: почему-то я сомневаюсь, что размер кисти составляет всего 1x1 пиксель.

Во-вторых, за исключением цикла столбца (и возможного цикла строки), не должно быть ответвлений (то есть структур управления потоком). Нет for (i=0;i<4;i++); просто напишите код для четырех последовательных каналов (при необходимости используйте макрос). Нет if (d[i]>255); выразить это как альтернативу: dest[i] = (temp>255?255:temp); по крайней мере, если не заменить его более эффективным способом насыщения (существуют трюки с использованием вычитаний, сдвигов и масок).

В-третьих, избегайте преобразования между плавающей точкой и целым числом; это всегда верный совет, но преобразования с плавающей точкой -> int особенно разрушительны для ARM. Поскольку вы манипулируете целыми числами, это означает, что здесь мы опускаем число с плавающей запятой.

И как только вы это сделаете, неожиданно, помимо ускорения работы над кодом, вы фактически выполнили подготовительную работу для NEON: NEON полезен только удаленно, если вы обрабатываете несколько пикселей одновременно, если нет ветвления, и если вы не конвертируете между плавающей точкой и целым числом повсюду. Так что только тогда мы будем говорить о НЕОН, если это даже необходимо в данный момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...