Целочисленные/плавающие значения с SSE

Мне нужно умножить вектор целых чисел на другой вектор целых чисел, а затем добавить результат (то есть вектор целых чисел) к вектору значений с плавающей запятой.

Должен ли я использовать MMX или SSE4 для целых чисел, или я могу просто использовать SSE со всеми этими значениями (даже если есть целое число?), помещая целые числа в регистры __m128?

Действительно, я часто использую целые числа в регистрах __m128 и не знаю, трачу ли я время (неявное приведение значений) или это одно и то же.

Я компилирую с опцией -O3.


person Polo    schedule 21.04.2015    source источник
comment
Покажите нам, что вы хотите сделать с некоторым кодом. Покажите скалярный код того, что вы хотите сделать, как предложил Пол Р.   -  person Z boson    schedule 22.04.2015


Ответы (2)


Вероятно, вам следует просто использовать SSE для всего (MMX — это просто очень устаревший предшественник SSE). Если вы собираетесь ориентироваться в основном на новые процессоры, вы можете даже рассмотреть AVX/AVX2.

Начните с чистой и надежной реализации всего в скалярном коде, а затем сравните его. Вполне возможно, что скалярная реализация будет достаточно быстрой, и больше ничего делать не потребуется. Кроме того, gcc и другие компиляторы (например, clang, ICC, даже Visual Studio) довольно хорошо справляются с автоматической векторизацией, поэтому вы можете получить SIMD-векторизованный код «бесплатно», который соответствует вашим потребностям в производительности. Однако, если на этом этапе вам все еще нужна более высокая производительность, вы можете начать преобразовывать свой скалярный код в SSE. Тем не менее, оставьте исходную скалярную реализацию для проверки и сравнительного анализа — очень легко внести ошибки при оптимизации кода, и полезно знать, насколько быстрее ваш оптимизированный код, чем базовый код (вы, вероятно, ищете где-то между 2x и 4x быстрее для SSE по сравнению со скалярным кодом).

person Paul R    schedule 21.04.2015

Хотя предыдущий ответ разумен, есть одно существенное отличие — организация данных. Для прямого использования SSE данные лучше организовать как структуру массивов (SoA). Как правило, ваш скалярный код может иметь данные, созданные вокруг макета Array-of-Structures (AoS). Если это так, преобразование из скалярной формы в векторную будет затруднено.

Подробнее https://software.intel.com/en-us/articles/creating-a-particle-system-with-streaming-simd-extensions

person Severin Pappadeux    schedule 21.04.2015
comment
Я думаю, что трудно сказать, что должен делать ОП, пока он не покажет нам код. - person Z boson; 22.04.2015