Я пытаюсь ускорить мой метод с помощью SSE (On Visual Studio). Я новичок в этом районе. Основными типами данных, с которыми я работаю в моем методе, являются биты размером 32 и логической операцией, которую я использую в основном, является операция И (с использованием _BitScanForward). Мне было интересно, можно ли использовать инструкции SSE для ускорения моих процедур.Реализация и выполнение использования битов с SSE
Это, как я делаю сейчас (я полностью сделан, и не могу сравнивать результаты напрямую):
загружает операнды (bitsets) с помощью _mm_set_ps. Я использую to_ulong() на bitsets, чтобы преобразовать их в неподписанные длинные целые числа:
__m128 v1 = _mm_set_ps(b1.to_ulong(),b2.to_ulong(),b3.to_ulong(),b4.to_ulong());
__m128 v2 = _mm_set1_ps(b.to_ulong())
Это следует собственно и операции:
__m128 v3 = _mm_and_ps(v1,v2);
На данный момент, у меня есть два вопроса:
Способ, которым я это делаю (преобразование битов в беззнаковые длинные целые числа с использованием to_ulong()) - хороший способ сделать это? Я подозреваю, что есть большие накладные расходы, которые могут убить потенциальное улучшение производительности, которое я могу извлечь из использования SSE.
Каков наилучший способ сохранить v3 в памяти в виде 4 битов? Я планирую использовать встроенный _mm_storeu_ps.
Спасибо, Пол. Это прекрасно работает! – SMir
Paul, _mm_set1_epi32 не работает с битами <32> экземпляров. Есть ли альтернатива, которая работает с реальными экземплярами битов? – SMir
Я не эксперт на C++, но я ожидаю, что вы можете легко преобразовать битовый набор <32> в 32-битный int либо с использованием существующего метода, либо путем написания вспомогательной функции. –