Код SIMD для этого (с использованием SSE3):
movaps xmm0,a
movaps xmm1,b
subps xmm0,xmm1
mulps xmm0,xmm0
haddps xmm0,xmm0
haddps xmm0,xmm0
, но для этого вам нужно четыре вектора значений (x, y, z, 0).Если у вас есть только три значения, вам нужно будет немного поиграться, чтобы получить требуемый формат, который бы отменил все вышеперечисленные преимущества.
В общем, из-за конвейерного суперскалярного преобразованияВ архитектуре ЦП наилучшим способом получения производительности является выполнение одной и той же операции с большим количеством данных. Таким образом, вы можете чередовать различные этапы и выполнять небольшую циклическую развертку, чтобы избежать остановок конвейера.Приведенный выше код определенно остановится на последних трех инструкциях, основанных на принципе «не может использовать значение сразу после его изменения» - вторая инструкция должна дождаться завершения результата предыдущей инструкции, что плохо втрубопроводная система.
Выполнение расчета по двум или более различным наборам точек одновременно может устранить вышеуказанное узкое место - во время ожидания результата одного вычисления вы можете начать вычисление следующей точки:
movaps xmm0,a1
movaps xmm2,a2
movaps xmm1,b1
movaps xmm3,b2
subps xmm0,xmm1
subps xmm2,xmm3
mulps xmm0,xmm0
mulps xmm2,xmm2
haddps xmm0,xmm0
haddps xmm2,xmm2
haddps xmm0,xmm0
haddps xmm2,xmm2