2015-01-20 3 views
0

Я посмотрел на разобранный код, созданный clang из операций glm (матричная векторная библиотека для 3d вычислений).флаги оптимизации clang для векторных вычислений матрицы

Я заметил, что clang выполняет некоторую «вектологию» для операций двойной точности, например. принуждение двух умножений в одной инструкции SIMD.

Однако для расчетов с одиночной точностью код кажется мне плохой. Инструкции используются из наборов инструкций SSE и регистров MMX, но каждая mulitplication выполняется для одного поплавка за раз, и даже группы присвоений (например, назначение матрицы) выполняются большой связью операторов movss , Эти плохие присваивания даже сохраняются для кода с двойной точностью.

Почему это, есть ли какие-либо аргументы командной строки, которые мотивировали бы clang делать лучше? Я знаю, что компиляторы не делают магии, но линейный список из 16 смежных по памяти назначений должен быть оптимизирован многими способами, я думаю?

ответ

0

В вашей сборке считывание хмм-регистра не является доказательством векторизации, так как каждая двойная операция выполняется в регистре SIMD (хотя бы один).

векторизации не является тривиальным для компилятора, лязг дает вариант, как

clang -fslp-vectorize-aggressive file.c 

это может помочь, иначе вы можете посмотреть на альтернативы, существует много библиотеки для умножения матриц, МКЛ, форсирует-цифровой, плазма , и т. д. В моих сувенирах GLM старен, хорошая альтернатива существует.

+0

Вы правы, регистры xmm используются для отдельных операций. С другой стороны, при операциях с двойной точностью используются две канальные операции. Поэтому я догадался, что я увижу четыре канала для одиночной точности, но нет, это еще хуже. – dronus

+0

Я быстро посмотрел на GLM (http://glm.g-truc.net/0.9.6/index.html), если это библиотека, по опыту SIMD-вычисление работает только на большом буфере, а не когда вы манипулируя небольшим фрагментом данных (если у вас есть список вершин, вы никогда ничего не сохраните с SIMD). Кроме того, вы пытались использовать распределитель распределения мейла (https://software.intel.com/en-us/articles/increasing-memory-throughput-with-intel-streaming-simd-extensions-4-intel-sse4-streaming- load) –

+0

У меня нет коллекций (например, списков) данных вершин, но несколько матриц или несколько вершин на стеке. Однако каждый отдельный вектор по матричному продукту должен иметь хороший выигрыш от SIMD, поскольку он уже состоит из 64 умножений на флоат и множество дополнений. Если бы четыре из них могли быть выполнены за один шаг, можно ожидать 4-кратное усиление. Поскольку нет коллекций, но много операций над стеком, кеши должны быть горячими и не должны дросселировать работу. – dronus

Смежные вопросы