Я хочу использовать версию хорошо известного алгоритма MIT bitcount для подсчета соседей в жизненной игре Конвея с использованием инструкций SSE2.
Вот количество битов MIT в c, расширенное для подсчета битов> 63 бит.
int bitCount(unsigned long long n)
{
unsigned long long uCount;
uCount = n – ((n >> 1) & 0×7777777777777777)
- ((n >> 2) & 0×3333333333333333)
- ((n >> 3) & 0×1111111111111111);
return ((uCount + (uCount >> 4))
& 0x0F0F0F0F0F0F0F0F) % 255;
}
Вот версия на Паскале
function bitcount(n: uint64): cardinal;
var ucount: uint64;
begin
ucount:= n - ((n shr 1) and $7777777777777777)
- ((n shr 2) and $3333333333333333)
- ((n shr 3) and $1111111111111111);
Result:= ((ucount + (count shr 4))
and $0F0F0F0F0F0F0F0F) mod 255;
end;
Я хочу параллельно подсчитывать биты в этой структуре.
32-bit word where the pixels are laid out as follows.
lo-byte lo-byte neighbor
0 4 8 C 048C 0 4 8 C
+---------------+
1|5 9 D 159D 1|5 9 D
| |
2|6 A E 26AE 2|6 A E
+---------------+
3 7 B F 37BF 3 7 B F
|-------------| << slice A
|---------------| << slice B
|---------------| << slice C
Обратите внимание, как эта структура имеет 16 бит посередине, которые необходимо найти. Я хочу вычислить количество соседей для каждого из 16 бит в середине, используя SSE2. Для этого я помещаю срез A в младшее слово XMM0, срез B в XXM0-dword1 и т. Д.
Я копирую XMM0 в XMM1 и маскирую биты 012-456-89A
для бита 5
в младшем слове XMM0, делаю то же самое для слова 1 XMM0 и т. д. с использованием разных срезов и масок, чтобы каждое слово в XMM0 и XMM1 содержало соседей для другого пикселя.
Вопрос
Как мне настроить MIT-bitcount так, чтобы в каждом слове XMM отображалось количество битов на слово / пиксель?
Примечания
Я не хочу использовать таблицу поиска, потому что у меня уже есть такой подход, и я хочу проверить, ускорит ли SSE2 процесс, не требуя доступа к памяти для поиска. стол.
Ответ с использованием сборки SSE был бы оптимальным, потому что я программирую это в Delphi, и поэтому я использую код сборки x86 + SSE2.
pshufb
, которая может выполнять поиск по 4 битам + переполнение = 4,5 бит. Это могло быть победителем. - person Johan   schedule 29.06.2011