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 verringert 😕 wenn 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 Problem

    Mit VTune bekomme ich diesen Wert:
    ((64k Aliasing Conflicts*12) / Clockticks)*100 = 18,55


Anmelden zum Antworten