Я пытаюсь понять замечание, высказанное «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).
Я не знаю, NEON либо, так что мне было интересно прочитать, что это имеет нагрузку обратного перемежения. Довольно ясно, что да, 'vld3' производит три выходных регистра. Ваш SSE 'pshufb' перетасовывает ваши данные в 6 байтов B, 5 байт G, затем 5 байт R, все в одном регистре. Это отличается от того, что дает вам 'vld3', и кажется менее полезным. Зачем вам нужны разные цветовые компоненты, смешанные в одном регистре? –
@PeterCordes - * Зачем вам нужны разные цветовые компоненты, смешанные в одном регистре ... »* - актуальной проблемой является функция сжатия хэшей BLAKE2. SSE2 и SSE4 доступны на [blake2.cpp] (https: // github. com/weidai11/cryptopp/blob/arm-neon/blake2.cpp), мы разрезаем NEON. Я использовал другой вопрос переполнения стека в качестве ориентира, чтобы помочь понять и избежать путаницы.Я также предполагаю, что больше людей понимают цвета RGB над функцией сжатия BLAKE2. – jww
_ «Похоже, что' vld3' в основном производит 3 выхода для каждого входа «_ - да, потому что вход является базовым адресом, указывающим на чередующиеся данные. Скажем, что указывает на массив ABCABCABCABC ... тогда вы получаете один регистр, полный As, один полный Bs и один полный Cs. Если вам нужен отдельный одиночный регистр, чтобы содержать шаблон AAAAAABBBBBBCCCCC, я думаю, вам понадобится какая-то перестановка 'vtbl', независимо от того, как вы ее загрузите. – Notlikethat