J'essaie de trouver un moyen de faire en sorte que l'ordinateur fonctionne pour moi. J'utilise SIMD (SSE2 & SSE3) pour calculer le produit croisé, et je me demandais si cela pourrait aller plus vite. Actuellement, j'ai les suivantes:Appelez une fonction plus bas dans le script à partir d'une fonction plus élevée dans le script
const int maskShuffleCross1 = _MM_SHUFFLE(3,0,2,1); // y z x
const int maskShuffleCross2 = _MM_SHUFFLE(3,1,0,2); // z x y
__m128 QuadCrossProduct(__m128* quadA, __m128* quadB)
{
// (y * other.z) - (z * other.y)
// (z * other.x) - (x * other.z)
// (x * other.y) - (y * other.x)
return
(
_mm_sub_ps
(
_mm_mul_ps
(
_mm_shuffle_ps(*quadA, *quadA, maskShuffleCross1),
_mm_shuffle_ps(*quadB, *quadB, maskShuffleCross2)
),
_mm_mul_ps
(
_mm_shuffle_ps(*quadA, *quadA, maskShuffleCross2),
_mm_shuffle_ps(*quadB, *quadB, maskShuffleCross1)
)
)
);
}
Comme vous pouvez le voir, il y a quatre _mm_shuffle_ps
« s là-dedans, et je me demandais si je pouvais les remplacer par une combinaison de _mm_unpackhi_ps
et _mm_unpacklo_ps
qui reviennent respectivement a2 a3 b2 b3
et a0 a1 b0 b1
et sont légèrement plus rapide. Je ne pouvais pas comprendre sur le papier, mais j'ai pensé à une solution. Que faire si l'ordinateur force les étapes requises? Juste récursivement parcourir les différentes options et voir ce qui donne la bonne réponse.
Je l'ai travailler avec se multiplient, il retourne quand je veux revenir (3, 12, 27, 0):
startA = _mm_set_ps(1.00, 2.00, 3.00, 0.00);
startB = _mm_set_ps(3.00, 3.00, 3.00, 0.00);
result0 = _mm_mul_ps(startA, startB);
// (3.00, 6.00, 9.00, 0.00)
result1 = _mm_mul_ps(startA, result0);
// (3.00, 12.00, 27.00, 0.00)
Très bien, si je le dis moi-même. Cependant, quand je voulais mettre en place la division je suis tombé sur un problème. Multiplier n'a pas seulement besoin d'appeler multiplier, il faut aussi appeler diviser. D'accord, nous avons donc diviser ci-dessus multiplier. Mais diviser ne doit pas seulement appeler diviser, il doit aussi appeler multiplier, ce qui est plus bas dans le script, donc il n'existe pas encore.
J'ai commencé avec une application console vide dans Visual C++ et tout mettre dans QuadTests.cpp.
Comment puis-je m'assurer que ces deux fonctions peuvent s'appeler l'une l'autre?
Merci d'avance.
Bien sûr! : D Cela m'a tout simplement échappé, mais je savais que le moteur de recherche humain Stack Overflow pouvait m'aider. ;) – knight666