Свернуть __mask64, также известное как 64-битное целое число, подсчитывающее полубайты, у которых все биты установлены?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Свернуть __mask64, также известное как 64-битное целое число, подсчитывающее полубайты, у которых все биты установлены?

Сообщение Anonymous »


У меня есть __mask64 в результате нескольких операций AVX512:

__mmask64 mboth = _kand_mask64(lres, hres);

Я хотел бы посчитать количество полубайтов, в которых все биты установлены (0xF).

Простое решение — сделать это:

uint64 imask = (uint64)mboth; в то время как (маска) { если (imask & 0xf == 0xf) рет++; имаск = имаск >> 4; } Мне хотелось чего-то лучшего, но то, что я придумал, не кажется элегантным:

//вне цикла __m512i b512_1s = _mm512_set1_epi32 (0xffffffff); __m512i b512_0s = _mm512_set1_epi32(0x00000000); //затем... __m512i vboth = _mm512_mask_set1_epi8 (b512_0s, mboth, 0xff); __mmask16 бит = _mm512_cmpeq_epi32_mask(b512_1s, vboth); ret += __builtin_popcount((unsigned int)fres); Приведенный выше пример помещает байт 0xff в вектор, где в маске существует 1 бит, а затем получает 1 бит в маске bits при увеличении Полубайты 0xf теперь обнаруживаются как 0xffffffff int32.

Я считаю, что две 512-битные операции — это излишество, когда исходные данные находятся в 64-битном числе. Этот альтернативный вариант, вероятно, намного хуже; слишком много инструкций, и он по-прежнему работает на 128 битах:
//вне цикла __m128i b128_1s = _mm_set1_epi32 (0xffffffff); //затем... uint64 Maskl = mboth & 0x0f0f0f0f0f0f0f0f0f; uint64 Maskh = mboth & 0xf0f0f0f0f0f0f0f0; uint64 маска128[2] = { (маска > 4) | маска }; __m128i bytes = _mm_cmpeq_epi8(b128_1s, *(__m128i*)mask128); uint биты = _mm_movemask_epi8 (байты); ret += __builtin_popcount(биты);
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»