2009-09-05 23 views
0

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.

Répondre

1

Juste pour confirmer, votre problème est que les fonctions disposées comme celui-ci ne fonctionnent pas, parce que doStuff n'est pas déclaré au moment où vous l'appelez de getFoo:

int getFoo(int bar) { 
    doStuff(bar + 1); 
} 

int doStuff(bar) { 
    if (bar == 2) { 
     return getFoo(bar); 
    } 

    return bar * 8; 
} 

Pour résoudre ce problème, vous devez faites un forward declaration de int doStuff(int). Souvent, cela se fait avec un fichier d'en-tête - de toute façon, vous avez juste besoin d'ajouter quelque chose comme ceci:

// #includes, etc. go here 

int doStuff(int); 
int getFoo(int); 

// methods follow 
+0

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