2016-05-09 3 views
0

Я пытаюсь понять замечание, высказанное «Iwillnotexist Idonotexist» в SIMD optimization of cvtColor using ARM NEON intrinsics:NEON, SSE и перемежения нагрузки против тасует

... почему вы не использовать ARM NEON intrisics, которые отображаются инструкция VLD3? Это избавляет вас от перетасовки, упрощая и ускоряя код. Реализация Intel SSE требует перетасовки, поскольку в ней отсутствуют инструкции по загрузке с обратным перемежением 2/3/4-way, но вы не должны передавать их, когда они доступны.

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

Согласно другому комментарию вопроса и Coding for NEON - Part 1: Load and Stores, ответ, вероятно, будет использовать VLD3.

К сожалению, я просто не вижу его (возможно, потому, что я менее знаком с NEON и его внутренними функциями). Кажется, что VLD3 в основном производит 3 выхода для каждого входа, поэтому моя металлическая модель запуталась.

Учитывая следующий instrinsics SSE, которые работают на данных в BGR BGR BGR BGR... формате, который нуждается в случайном порядке для BBBB GGGG RRRR ...:

const byte* data = ... // assume 16-byte aligned 
const __m128i mask = _mm_setr_epi8(0,3,6,9,12,15,1,4,7,10,13,2,5,8,11,14); 
__m128i a = _mm_shuffle_epi8(_mm_load_si128((__m128i*)(data)),mask); 

Как мы выполняем чередующиеся нагрузки, используя NEON так встроенные функции, что мы не нуждаемся в SSE перетасовки?


Также обратите внимание ... Меня интересуют внутренности, а не ASM. Я могу использовать встроенные средства ARM для устройств под управлением Windows Phone, Windows Store и Linux под MSVC, ICC, Clang и т. Д. Я не могу это сделать с ASM, и я не пытаюсь специализироваться на этом коде 3 раза (Microsoft 32- бит ASM, 64-разрядная ASM и Microsoft GCC ASM).

+0

Я не знаю, NEON либо, так что мне было интересно прочитать, что это имеет нагрузку обратного перемежения. Довольно ясно, что да, 'vld3' производит три выходных регистра. Ваш SSE 'pshufb' перетасовывает ваши данные в 6 байтов B, 5 байт G, затем 5 байт R, все в одном регистре. Это отличается от того, что дает вам 'vld3', и кажется менее полезным. Зачем вам нужны разные цветовые компоненты, смешанные в одном регистре? –

+0

@PeterCordes - * Зачем вам нужны разные цветовые компоненты, смешанные в одном регистре ... »* - актуальной проблемой является функция сжатия хэшей BLAKE2. SSE2 и SSE4 доступны на [blake2.cpp] (https: // github. com/weidai11/cryptopp/blob/arm-neon/blake2.cpp), мы разрезаем NEON. Я использовал другой вопрос переполнения стека в качестве ориентира, чтобы помочь понять и избежать путаницы.Я также предполагаю, что больше людей понимают цвета RGB над функцией сжатия BLAKE2. – jww

+2

_ «Похоже, что' vld3' в основном производит 3 выхода для каждого входа «_ - да, потому что вход является базовым адресом, указывающим на чередующиеся данные. Скажем, что указывает на массив ABCABCABCABC ... тогда вы получаете один регистр, полный As, один полный Bs и один полный Cs. Если вам нужен отдельный одиночный регистр, чтобы содержать шаблон AAAAAABBBBBBCCCCC, я думаю, вам понадобится какая-то перестановка 'vtbl', независимо от того, как вы ее загрузите. – Notlikethat

ответ

1

Согласно этой страницы:

VLD3 характеристическую вам нужно:

int8x8x3_t vld3_s8(__transfersize(24) int8_t const * ptr); 
// VLD3.8 {d0, d1, d2}, [r0] 

Если по адресу, на который указывает ptr у вас есть эти данные:

0x00: 33221100 
0x04: 77665544 
0x08: bbaa9988 
0x0c: ffddccbb 
0x10:
0x14: fedcba98 

Вы, наконец, получить в регистры:

d0: ba54ffbb99663300 
d1: dc7610ccaa774411 
d2: fe9832ddbb885522 

int8x8x3_t структура определяется как:

struct int8x8x3_t 
{ 
    int8x8_t val[3]; 
}; 
+0

Единственная существенная разница между этим и исходным кодом SSE - размер передачи. Код SSE, по-видимому, переписывал 128-битные данные, тогда как NEON будет переставлять 3 * 64-разрядные или 3 * 128-битные нагрузки, поэтому для соответствия этой исходной проблеме может потребоваться немного перетасовки данных, чтобы что-то поместилось новые размеры данных. – solidpixel