J'ai commencé à optimiser mon code en utilisant SSE. Essentiellement, il s'agit d'un traceur de rayons qui traite 4 rayons à la fois en stockant les coordonnées dans __m128 types de données x, y, z (les coordonnées pour les quatre rayons sont regroupées par axe). Cependant, j'ai une instruction ramifiée qui protège contre la division par zéro, je ne peux pas sembler convertir en SSE. En série c'est:SSE intrinsèques pour comparaison (_mm_cmpeq_ps) et opération d'affectation
const float d = wZ == -1.0f ? 1.0f/(1.0f-wZ) : 1.0f/(1.0f+wZ);
Où wZ est coordonnée z et ce calcul doit être fait pour les quatre rayons.
Comment pourrais-je traduire cela en SSE?
J'ai expérimenté en utilisant l'ESS est égale à la comparaison comme suit (WZ maintenant se rapporte à un type de données __m128 contenant les valeurs z pour chacun des quatre rayons):
_mm_cmpeq_ps(_mm_set1_ps(-1.0f) , wZ)
Et puis en utilisant ceci pour identifier les cas où wZ [x] = -1.0, en prenant la valeur absolue de ce cas, puis continuer le calcul comme d'habitude.
Cependant, je n'ai pas eu beaucoup de succès dans cette entreprise.
Qu'est-ce qui ne va pas avec diviser par zéro? – Pubby
Outre les problèmes évidents, il corrompt les résultats en créant une incohérence à Nz = -1 pour le reste de l'algorithme. – cubiclewar