Mittlerweile sind es durch die kleinen aber feinen Optimierungen von Himitsu sogar 20.000 Zykel - und damit bin ich ziemlich zufrieden
Vielen Dank für deine Erklärung zu SSE, hat echt ein paar Fragen geklärt. Allerdings hab ich SSE schon an mehreren Stellen im Einsatz gefunden - an der selben
Stelle an der ich auch im Moment arbeite, 3D-Mathematik, die ja Hauptsächlich in Spielen eingesetzt wird. z.B. die Doom-3-Engine, hat für eigentlich alle damaligen
Befehlssätze einen eigenen Prozessor implementiert (ist natürlich kein Prozessor, hat idSoftware so getauft) - also 3D!Now, MMX, SSE, SSE2, SSE3 und 'AltiVec' (hatte ich vorher noch nie von gehört). Es kann natürlich sein dass der Trend mittlerweile davon abgerückt ist - doom ist ja nicht mehr das neusete, doch es bringt ja noch immer einiges an Performancegewinn (50% bei Arrays)...Und da das ganze heute eigentlich jeder Prozessor unterstützt, und auch auf jedem einen - mehr oder weniger großen - Performancegewinn bringt, werd ich auch jeden Fall teilweise darauf zurückgreifen, um die Zeitkritischsten Sachen zu beschleunigen.
Wird zwar einiges an Zeit dauern bis ich alle operationen so hab wie ich will, aber ists auch für den Lernfaktor wert
Und so extrem unübersichtlich sind auch erweiterte Algorithmen nicht
imho...das Kreuzprodukt kann ja berechnet werden durch:
Code:
__asm
{
MOV EAX Op_A // Load pointers into CPU regs
MOV EBX, Op_B
MOVUPS XMM0, [EAX] // Move unaligned vectors to SSE regs
MOVUPS XMM1, [EBX]
MOVAPS XMM2, XMM0 // Make a copy of vector A
MOVAPS XMM3, XMM1 // Make a copy of vector B
SHUFPS XMM0, XMM0, 0xD8 // 11 01 10 00 Flip the middle elements of A
SHUFPS XMM1, XMM1, 0xE1 // 11 10 00 01 Flip first two elements of B
MULPS XMM0, XMM1 // Multiply the modified register vectors
SHUFPS XMM2, XMM2, 0xE1 // 11 10 00 01 Flip first two elements of the A copy
SHUFPS XMM3, XMM3, 0xD8 // 11 01 10 00 Flip the middle elements of the B copy
MULPS XMM2, XMM3 // Multiply the modified register vectors
SUBPS XMM0, XMM2 // Subtract the two resulting register vectors
MOVUPS [Ret_Vector], XMM0 // Save the return vector
}
(Nicht meine Implementierung, an der Delphi Version feil ich noch)
Was zwar nicht wenig ist, aber merklich schneller läuft als der vom Compiler erzeugte Source
Was mich besonders fasziniert ist, dass es immer noch um 5-6000 Zykel schneller ist, einen 4D-Vector per SSE zu berechnen,
als einen 3D-Vector mit normalem Delphi Source...Und das auf einer relativ aktuellen CPU - Welche ja wenn ich das richtig verstanden habe
nicht so wirklich auf SSE setzen / wo SSE nicht so optimiert ist wie es sein könnte. Auf älteren CPU's müsste dann ja das ganze noch mehr Performance einbringen,
oder nicht?