Загрузка вектора на границу массива в ARM NEON

Я пытаюсь оптимизировать некоторые алгоритмы обработки изображений для ARM с помощью встроенных функций NEON. Для некоторых фильтров необходимо загружать элементы в окрестности точки. Например, чтобы отфильтровать изображение в пикселях p[x], мне нужно загрузить p[x - 1], p[x] и p[x + 1]. Если x=0, то загружаю p[0], p[0] и p[1]. Если x=width-1, то загружаю p[width-2], p[width-1] и p[width-1].

Итак, если у меня есть вектор:

uint8x16_t a = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};

Как я могу получить из него следующие векторы:

uint8x16_t b = {0, 0, 1, 2, 3, 4, 5, 6, 7,  8,  9, 10, 11, 12, 13, 14};
uint8x16_t c = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 15};

person Community    schedule 02.12.2015    source источник


Ответы (1)


Я думаю, что следующие функции будут полезны для вашего случая:

template <size_t count> inline uint8x16_t LoadBeforeFirst(uint8x16_t first)
{
    return vextq_u8(vextq_u8(first, first, count), first, 16 - count);
}

template <size_t count> inline uint8x16_t LoadAfterLast(uint8x16_t last)
{
    return vextq_u8(last, vextq_u8(last, last, 16 - count), count);
}
person ErmIg    schedule 02.12.2015