C ++ Как написать код, компилятор может легко оптимизировать для SIMD?

StackOverflow https://stackoverflow.com/questions/4026703

  •  26-09-2019
  •  | 
  •  

Вопрос

Я работаю в Visual Studio 2008 и в настройках проекта, я вижу вариант для «активации расширенного набора инструкций», которую я могу установить, SSE или SSE2

Таким образом, компилятор попытается объединить инструкции для использования инструкций SIMD?

Есть ли какие-либо правила, которые можно следить за тем, как оптимизировать код, такой, что компилятор может сделать ассемблер эффектов, используя эти расширения?

Например, в настоящее время я работаю над луком. Шейдер принимает некоторое вход и рассчитывает из ввода выходного цвета, как это:

PixelData data = RayTracer::gatherPixelData(pixel.x, pixel.y);
Color col = shadePixel(data);

Было ли это, например, будет полезно для записи ShaderCode такого, что оно затенено 4 различных пикселей в одном инструкции? что-то вроде этого:

PixelData data1 = RayTracer::gatherPixelData(pixel1.x, pixel1.y);
...
shadePixels(data1, data2, data3, data4, &col1out, &col2out, &col3out, &col4out);

обрабатывать несколько DataUnits сразу. Будет ли это выгодно для того, чтобы сделать компилятор использовать инструкции SSE?

Спасибо!

Это было полезно?

Решение

Я работаю в Visual Studio 2008 и в настройках проекта, я вижу вариант для «активации расширенного набора инструкций», которую я могу установить, SSE или SSE2

Таким образом, компилятор попытается объединить инструкции для использования инструкций SIMD?

Нет, компилятор не будет использовать векторные инструкции самостоятельно. Он будет использовать скалярные инструкции SSE вместо x87.

То, что вы описываете, называется «автоматическая векторизация». Компиляторы Microsoft не делают этого, Компиляторы Intel делать.

На Microsoft Compiler вы можете использовать Внутрисины Для выполнения ручных оптимизаций SSE.

Другие советы

Три наблюдения.

  1. Лучшие ускорения не исходят от оптимизации, а от Хорошие алгоритмы. Отказ Так что убедитесь, что вы получите эту часть прямо сначала. Часто это означает, что просто использует правильные библиотеки для вашего конкретного домена.

  2. Как только вы получите свои алгоритмы правильно, пора Мера. Отказ Часто есть правило 80/20 на работе. 20% вашего кода займет 80% времени выполнения. Но для того, чтобы найти эту часть, вам нужен хороший профилировщик. Intel Vtune. Может дать вам профиль отбора проб из каждой функции и приятных отчетов, которые точно определяют убийцы производительности. Другая бесплатная альтернатива AMD CodeAlyst. Если у вас есть CPU AMD.

  3. Возможность автовектора компилятора не является серебряной пулью. Хотя это постарается очень сложно (особенно Intel C ++) Вам часто нужно помочь ему, переписав алгоритмы в векторной форме. Вы часто можете получить гораздо лучшие результаты, под руководством небольших порций кода узкого места для использования инструкций SIMD. Вы можете сделать это в C-коде (см. Ссылку VJO выше), используя встроенные или использовать встроенную сборку.

Конечно, частей 2 и 3 образуют итерационный процесс. Если вы действительно серьезно относитесь к этому, то есть несколько хороших книг по теме Intel Folks, такие как Оптимизация программного обеспечения Cookbook и справочные руководства процессора.

Компилятор не все могущественны, и у него есть некоторые ограничения. Если это может (и если правильные флаги передаются ему), он будет использовать инструкции SSE. Единственный способ посмотреть, что это было, - это изучить код сборки, генерируемый компилятором.

Другой вариант - использовать инструкции C SSE / SSE2. Для Windows вы можете найти их здесь:

http://msdn.microsoft.com/en-us/library/y0dh78ez%28vs.80%29.aspx.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top