Я должен умножить вектор целых чисел на другой вектор целых чисел, а затем добавить результат (то есть вектор целых чисел) с вектором значений с плавающей запятой.
Должен ли я использовать MMX или SSE4 для целых чисел или я могу просто использовать SSE со всеми этими значениями (даже если есть целое число?), Помещая целые числа в регистры __m128?
Действительно, я часто использую целые числа в регистрах __m128, и я не знаю, трачу ли я время (неявные значения приведения) или это одно и то же.
Я компилирую с опцией -O3.
Вы, вероятно, должны просто использовать SSE для всего (MMX — просто очень устаревший предшественник SSE). Если вы собираетесь ориентироваться в основном на новые процессоры, то вы можете даже рассмотреть AVX / AVX2.
Начните с чистой и надежной реализации всего в скалярном коде, а затем сравните его. Вполне возможно, что скалярная реализация будет достаточно быстрой, и вам больше ничего не нужно делать. Кроме того, gcc и другие компиляторы (например, clang, ICC, даже Visual Studio) достаточно хорошо справляются с автоматической векторизацией, поэтому вы можете получить SIMD-векторизованный код «бесплатно», который отвечает вашим потребностям в производительности. Однако, если вам все еще нужна более высокая производительность, вы можете начать преобразовывать скалярный код в SSE. Сохраняйте исходную скалярную реализацию для целей проверки и бенчмаркинга — очень легко вносить ошибки при оптимизации кода, и полезно знать, насколько быстрее ваш оптимизированный код, чем базовый код (вы, вероятно, ищете где-то между 2x и 4x быстрее для SSE по сравнению со скалярным кодом).
Хотя предыдущий ответ является разумным, есть одно существенное отличие — организация данных. Для прямого использования SSE данные лучше организовать в виде структуры массивов (SoA). Как правило, в скалярном коде могут быть данные, созданные с использованием компоновки Array-of-Structures (AoS). В этом случае преобразование из скалярной в векторизованную форму будет затруднено.
Больше чтения https://software.intel.com/en-us/articles/creating-a-particle-system-with-streaming-simd-extensions