В AVX есть ли какой-либо специальный макрос, который помогает построить непосредственную константу для встроенных функций _mm256_shuffle_*
, например _MM_SHUFFLE(..)
для своего аналога SSE? Я не могу найти.Макрос для генерации непосредственных для свойств AVX-перетасовки
1
A
ответ
3
Вы по-прежнему используете _MM_SHUFFLE()
для перетасовки, которые принимают вход управления как 8-битный. например _mm256_shuffle_epi32
(vpshufd
) делает ту же перетасовку на обеих полосах движения.
_MM_SHUFFLE(dd,cc,bb,aa)
просто упаковывает низкие 2 бита каждого аргумента в 0bddccbbaa
.
Вы можете написать _MM_SHUFFLE(1,1,1,1)
(элемент вещания 1) как 0b01010101
, то есть 0x55
.
Вы можете использовать разделители C++ 14 (или что бы они ни называли), чтобы записать его как 0b01'01'01'01
для лучшей удобочитаемости человека, особенно. в случаях, когда каждый элемент отличается.
Я думаю, что база-4 в этом случае лучше, чем двоичная. Две цифры базового 4 - это одна базовая цифра 16 (шестнадцатеричная). Например, если вы хотите перетасовать 3,1,1,2, что будет 3 * 4 + 1, 1 * 4 + 2 = 0xda. С другой стороны, _MM_SHUFFLE в основном базовый 4 и более читаемый. –
@Zboson: можете ли вы использовать base-4 в C? Я использую _MM_SHUFFLE в C, но '0baabbccdd' в asm. Я думаю, что в файле '.S', который gcc будет запускать через CPP перед сборкой, вы можете скопировать определение макроса для _MM_SHUFFLE. –
Нет, я делаю это в своей голове и записываю шестнадцатеричное значение, или я пишу комментарий. Но '_MM_SHUFFLE' в основном представляет собой макрос базы 4. –