Einzelnen Beitrag anzeigen

Edlmann

Registriert seit: 19. Nov 2010
212 Beiträge
 
#16

AW: [ASM / SSE] Vektoroperationen

  Alt 14. Jun 2012, 11:04
Bin jetzt grad dabei die SSE-Beschleunigung in meine Vektor-Unit einzubauen...

allerdings steh ich grad vor nem Problem: Ich möchte die Länge eines Vektors bestimmen...
Die einzelnen Werte zu quadrieren ist ja kein Problem, allerdings scheiter ich grad dabei
eine Alternative zum C++ Intrinsic _mm_hadd_ps zu finden...Dieser Intrinsic addiert alle 4 Werte
in einem MMX Register und speichert das Ergebnis im Ersten Wert des Ergebnis-Registers...
Man könnte natürlich - angenommen man hat die quadrierten Werte in MMX0 - in MMX1 die Werte mit SHUFPS um 1 verschoben speichern (x = MMX0.y, y = MMX.z etc), in MMX2 dann um 2 verschoben und in MMX3 um3 verschoben,
diese 4 Register dann addieren, und man hätte das Ergebnis...Doch die Performance davon ist definitiv
nicht besser als der Native Quelltext

Hat da jeman deine Idee?

Delphi-Quellcode:
//Deklaration des Vectors
TVec4 = record
   x, y, z, w: Single;
end;

//GetLength prozedur
function GetLength(vector4: TVec4): Single;
asm
  MOVUPS XMM0, DWORD PTR [&vector4]
  MULPS XMM0, XMM0
  MOVUPS DQWORD PTR [&Result], XMM0
  //Hier müssten jetzt die Werte aus XMM0 alle aufaddiert und wieder in MMX0 gespeichert werden
  SQRTSS XMM0, XMM1
  MOVSS XMM0, Result
end;

Geändert von Edlmann (14. Jun 2012 um 11:23 Uhr)
  Mit Zitat antworten Zitat