Этот вопрос связан с этим: Optimal uint8_t bitmap into a 8 x 32bit SIMD "bool" vectorсдвига элементов к слева от SIMD регистров на основе булевой маски
Я хотел бы создать оптимальную функцию с этой подписью:
__m256i PackLeft(__m256i inputVector, __m256i boolVector);
желаемое поведение в том, что на вход 64-битной Int, например так:
inputVector = {42, 17, 13, 3}
boolVector = {истина, ложь, правда, ложь}
Он скрывает все значения, которые имеют false
в boolVector
, а затем проведет архивацию значения, которые остаются слева. На выходе выше, возвращаемое значение должно быть:
{42, 13, X, X}
... Где Х "Меня не волнует".
Очевидным способом сделать это является использование _mm_movemask_epi8
, чтобы получить 8-байтовый int из вектора bool, посмотреть маску тасования в таблице и затем перетасовать маску.
Однако, если это возможно, я бы хотел избежать таблицы поиска. Есть ли более быстрое решение?
Связанный: http://stackoverflow.com/questions/18708232/fast-compact-register-using-sse и http://stackoverflow.com/questions/25074197/compact-avx2-register-so-selected-integers -are-contiguous-matching-to-mask –
@PaulR, если у вас есть 32-разрядное целое число с нулевым байтом, вы знаете умный способ сдвинуть нули? Я имею в виду, например, x01 00 00 05 -> 0x01 05 00 00 без обхода байтов? –
Разве вы не хотите знать, сколько значений истинно? Если вы уже знаете это, это может быть полезным вкладом в вашу функцию.Если нет, мне кажется, что это должен быть выход. –