2014-12-07 4 views
2

Мне было интересно, могу ли я суммировать или умножать две переменные float32?SSE 64-разрядные регистры

Стоит ли делать все суммы и умножения, которые происходят очень часто (например, в видеоиграх при расчете простых траекторий пули) в регистры SSE?

+0

Нет. Необходимо изучить, как использовать профилировщик. –

+0

@ HansPassant, почему вы пишете про профилировщик? Я просто хочу улучшить некоторые математические функции. – greenfox

+1

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

ответ

1

Весь смысл SSE - действительно быстро обрабатывать множество чисел. И способность обрабатывать два числа одновременно помогает в этом. Например, вы действительно можете добавить шаг {dx, dy} к координате {x, y} в одной инструкции (ADDPS). На самом деле это могло бы добавить 4 поплавка, поскольку регистры составляют 128 бит, но это может быть ненужным для вашего случая. ADDPD разделяет 128 бит в 2x64, поэтому он добавляет два удвоения. («float64»)

+1

Обратите внимание, что большинство современных процессоров x86 имеют два FPU, поэтому от 2-х широкомасштабных операций SIMD не так много. Если вы можете делать 4 поплавки за один раз, то тогда это должно быть 2x выигрыш над скалярным кодом. –

+0

@PaulR: Возможно, вы захотите снова проверить свою документацию. Есть крошечное пятно правды в том, что AMD Bulldozer делится своими FPU между ядрами, поэтому у четырехъядерных процессоров действительно есть два FPU. Однако, поскольку они SSE, даже те могут обрабатывать 4 поплавки за один раз - так что всего 8. – MSalters

+0

Я не очень хорошо знаком с процессорами AMD, но у современных и новейших Intel Core i7 есть два FPU на ядро, поэтому вы можете выпустить две скалярные команды с плавающей запятой за такт. –

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