Я начал оптимизировать свой код с помощью SSE. По сути, это трассировщик лучей, который обрабатывает 4 луча одновременно, сохраняя координаты в __m128 типов данных x, y, z (координаты для четырех лучей сгруппированы по осям). Однако у меня есть разветвленный оператор, который защищает от деления на ноль, и я не могу преобразовать его в SSE. В сериале это:
const float d = wZ == -1.0f ? 1.0f/( 1.0f-wZ) : 1.0f/(1.0f+wZ);
Где wZ — это координата z, и этот расчет необходимо выполнить для всех четырех лучей.
Как я могу перевести это в SSE?
Я экспериментировал с использованием сравнения SSE equals следующим образом (теперь wz относится к типу данных __m128, содержащему значения z для каждого из четырех лучей):
_mm_cmpeq_ps(_mm_set1_ps(-1.0f) , wZ )
А затем использовать это для определения случаев, когда wZ[x] = -1,0, взяв абсолютное значение этого случая, а затем продолжить расчет в обычном режиме.
Однако я не добился больших успехов в этом начинании.