Hallo,
Diese Parallelität hat ja auch auf der CPU Vorteile, da Teile
auf die verschiedenen mehrfach vorhandenen Arbeiteinheiten verteilt werden können.
Jetzt habe ich noch einen Sprung drin und die anderen durch CMOV ersetzt.
Das bringt eine Verlangsamung bei einem immer konstanten Wert , aber eine erhebliche Beschleunigung bei zufälligen werten.
Momentan ~35 Takte für immer gleichen Wert und ~42 für zufällige Daten.
Zuvor: SelectionsortASMDown2
--Bei einem konstanten Feld 28 Takte
--Bei einem randomisierten Feld 60 Takte.
Lasse ich jetzt weg..siehe unten
Vielleicht sollte man EBX zusätzlich nutzen und dort DX bearbeiten.
Gruß Horst
EDIT:
Ich hatte mal im Hinterkopf, dass AMD-Chips es einem unheimlich übel nehmen, wenn man im Speicher/Cache auf DWOrd Daten plötzlich word-mäßig zugreift.
Das scheint zu stimmen.
Delphi-Quellcode:
procedure SelectionsortASMDown3(
var A: ByteArray);
register;
label Weiter5;
asm
// In einer asm-Anweisung muss der Inhalt der Register
// EDI, ESI, ESP, EBP und EBX erhalten bleiben, während die Register
// EAX, ECX und EDX beliebig geändert werden können.
PUSH EAX;
PUSh EBX;
mov EAX,[EAX];
MOV BX,AX
Xchg BH,BL
//1 tauscht CL,CH
MOV CX,AX;
SHR EAX,16;
MOV DX,AX
Xchg AH,AL
//2 tauscht DL,DH
cmp CH,CL;
cmovc cx,bx
cmp DH,
DL;
cmovc dx,ax
Xchg CL,DH;
//CX(L,H) : DH,CH ,DX(L,H) : DL,CL
mov BX,CX
mov AX,DX
cmp CL,CH;
Xchg BH,BL
// Veraendert Carry nicht
Xchg AH,AL
cmovc cx,bx
cmp
DL,DH;
cmovc dx,ax
Xchg CL,DH;
// Zurücktauschen
cmp
DL,CH;
jnb Weiter5;
xchg
DL,CH;
Weiter5:
POP EBX
SHL EDX,16
MOV DX,CX
POP EAX
mov [EAX],EDX;
end;
Jetzt sind es:
~14 Takte für ein konstanten Wert und
~24 Takte für randomisierte Werte, gegenüber 60 schon eine Verbesserung.
Enorm, was ein einziger falscher Sprung kostet, das müssen ja 20 Takte sein.
Es sind 31 Assemblerbefehle, da ist doch eine gewisse parallele Verarbeitung am Werk.