Schlechtere Performance vermutlich durch Aliasing Konflikte
-
Hallo!
Ich habe ein Bildverarbeitung- Algorithmus mit Hilfe von SS2 Befehlen implementiert.
Für Berechnungen benutze ich ich hauptsächlich die 128Bit Xmm Register, jedoch muss ich an einer Stelle die General Purpose Register benutzen.
Ich habe herausgefunden das die Ausführungszeit diese Algorithmuses sich von 38 auf 25 ms verringertwenn ich noch zusätzlich einen schiebe Befehl einfüge.
Mit VTune (von Intel) habe ich entdeckt das sehr viel „64k Aliasing Conflics“ auftreten. Diese treten jedoch etwas weniger auf, wenn ich den Shift Befehl shl edx,0 hinzufüge.
Hat jemand eine Idee was das für einen Grund haben könnte?
Wenn es an den Aliasing Conflics liegt, wie kann ich dies entfernen und warum treten diese auf?Diese ist ein Ausschnitt aus dem Programm:
PADDW xmm5,xmm6 PADDW xmm1,xmm2 PADDW xmm4,xmm5 MOVD esi,xmm4 ;copy 32 the low 32bits of xmm4 in esi shl esi,16 ;set bit 15-31 to zero shr esi,16 shl edx,0 ; no modification sub esi,edx shr esi,5 ; esi divided by /32 MOV [edi],esi inc edi …
Vielen Dank,
Johannes
-
Das 64k aliasing-problem wird im Initel Optimization Manual auf Seite 2-38 beschrieben. Im Endeffekt heißt es folgendes: Der L1-Daten-Cache kann nu 64kiB Daten halten. Wenn man nun Adressen benutzt, die genau 64 kiB voneinander entfernt sind, wird die eine Verarbeitet und die andere Anweisung komtm nicht zum Zug, weil die erste noch den Cache blockiert. Wie das mitm Code demn du gepostet zusammenhängt wieß ich aber auch nicht
Auf jeden Fall soll laut Intel das besietigen dieser Konflikte bis zu 3fach Geschwindigkeit bringen.
-
Weiss jemand konkret wie ich Code Aliasing im Cache vermeiden kann.
Ich habe diese Befehle:
"shl esi,16
shr esi,16
shl edx,0 "durch diesen ersetzt:
"esi,0xffff"
Da er genauso schnell ist.
Jedoch habe ich immer noch das Aliasing ProblemMit VTune bekomme ich diesen Wert:
((64k Aliasing Conflicts*12) / Clockticks)*100 = 18,55