Frage

Ich versuche, einen Weg zu entwickeln, um den Computer für mich etwas Arbeit zu machen tun. Ich bin mit SIMD (SSE2 & SSE3) dem Kreuzprodukt zu berechnen, und ich frage mich, ob es nicht schneller gehen könnte. Zur Zeit habe ich die folgende:

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)
         )
      )
   );
}

Wie Sie sehen können, gibt es vier _mm_shuffle_ps ist da drin, und ich fragte mich, ob ich sie mit einer Kombination aus _mm_unpackhi_ps und _mm_unpacklo_ps die Rückkehr a2 a3 b2 b3 und a0 a1 b0 b1 bzw. ersetzen könnte und sind etwas schneller.

Ich kann es nicht auf dem Papier herausfinden, aber ich dachte an einer Lösung. Was passiert, wenn lassen Sie den Computer Brute-Force die erforderlichen Schritte? Nur rekursiv Schritt durch die verschiedenen Optionen und sehen, was die richtige Antwort gibt.

Ich habe es mit mehrfach arbeiten, ist es diese gibt, wenn ich es zurückgeben möchten (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)

Sehr schön, wenn ich so sagen selbst.

Allerdings, wenn ich Kluft implementieren wollte stolperte ich auf ein Problem. Multiplizieren Sie nicht nur mehrfach anrufen müssen, hat es auch Kluft nennen. Okay, so setzen wir teilen oben vermehren. Aber Kluft nicht nur Kluft zu nennen hat, es muss auch mehrfach nennen, was im Skript niedriger ist, so ist es noch nicht existiert.

Ich begann mit einer leeren Konsolenanwendung in Visual C ++ und legt alles in QuadTests.cpp.

Wie kann ich sicherstellen, dass diese beiden Funktionen gegenseitig aufrufen können?

Vielen Dank im Voraus.

War es hilfreich?

Lösung

nur um zu bestätigen, Ihr Problem ist, dass wie diese angeordneten Funktionen nicht funktionieren, weil doStuff nicht durch die Zeit, die Sie nennen es von getFoo deklariert wird:

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

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

    return bar * 8;
}

Um dies zu beheben, müssen Sie eine forward-Deklaration von int doStuff(int). Oft wird dies mit einer Header-Datei getan - so oder so, man muss nur etwas addieren:

// #includes, etc. go here

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

// methods follow
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top