Seite 2 von 10

Verfasst: 18.02.2005 13:10
von Froggerprogger
remi_meier hat geschrieben:Ganz interessant ist folgendes:
Was denn daran ?
Bei mir laufen beide Schleifen etwa gleich schnell, allerdings die erste immer etwas schneller, was aber mit der Messmethode zusammenhängen wird.

Bzgl. Optimizer:
Feine Sache! :allright:

Verfasst: 18.02.2005 14:38
von remi_meier
Naja bei mir ist die 1. Schleife grad mal doppelt so schnell wie die 2. /:->
Hm... Muss wohl noch n bisschen im Internet stöbern, bis ich herausgefunden hab, wie ich mit den NOP's richtig umgehen muss (war hier einfach ein bisschen Zufall).

greetz
remi

PS: Neue Version Online: Kleine Optimierungen entfernt und noch 2 hinzugefügt.

Verfasst: 18.02.2005 19:11
von Helle
Die NOP´s (wie jeder andere Befehl auch) verändern die Speicherausricht-
ung nachfolgender Daten. Landet dann ein Datum (z.B.Variable) auf einer
glatt durch 4 teilbaren Speicheradresse geschehen ware Geschwindigkeits-
wunder! Man könnte auch Versuche mit dem zwangsweisen Setzen des AC-Flags (Alignment-Check) machen, aber das Ganze hängt von zuviel
Unwägbarkeiten ab.

Verfasst: 18.02.2005 19:22
von remi_meier
@Helle: Das Problem ist hier leider, dass ich die Bytes für die Adressen berechnen müsste, wie es der Assembler macht. Und das scheint mir im Moment leider ziemlich unmöglich :roll:

Wenn jemand ne Idee hat...

Verfasst: 18.02.2005 21:00
von remi_meier
Ein kleines Update und das aktuelle Beispiel:

Code: Alles auswählen

a = 5
b = 6
c = 7
d = 3
e = 1
#N = 49999999
Delay(1000)

time1 = ElapsedMilliseconds()
For z = 1 To #N
  ;{ Integer
  b - 1
  c - a / d
  c = a % 2
  a % 2
  a = b * 3
  a * 3
  zahl = i2/e
  zahl = -i2 - -c
  c = a
  a = b
  b = c
  ;}
Next
time1 = ElapsedMilliseconds() - time1

time2 = ElapsedMilliseconds()
For z = 1 To #N
  ;{ Integer
  !DEC [v_b] 
  
  !MOV    Ebx,dword [v_c] 
  !MOV    Eax,dword [v_a] 
  !MOV    Edi,dword [v_d] 
  !CDQ 
  !IDIV   Edi 
  !SUB    Ebx,Eax 
  !MOV    dword [v_c],Ebx
  
  !MOV    Eax,dword [v_a] 
  !AND    Eax,1
  !MOV    dword [v_c],Eax 
  
  !AND    dword[v_c], 1
  
  !MOV Eax,[v_b] 
  !LEA Eax,[Eax*2+Eax] 
  !MOV [v_a],Eax
  
  !MOV Eax,[v_a] 
  !LEA Eax,[Eax*2+Eax] 
  !MOV [v_a],Eax
  
  !MOV   Ebx, dword [v_e] 
  !MOV   Eax, dword [v_i2] 
  !CDQ 
  !IDIV   Ebx 
  !MOV    dword [v_zahl],Ebx
  
  !MOV    Ebx,dword [v_i2]
  !NEG    Ebx
  !ADD    Ebx,dword [v_c]
  !MOV    dword [v_zahl],Ebx
  
  !MOV  Eax,dword [v_a]
  !MOV  Ebx,dword [v_b]
  !MOV  dword [v_b],Eax
  !MOV  dword [v_a],Ebx
  !MOV  dword [v_c],Eax
  ;}
Next
time2 = ElapsedMilliseconds() - time2

MessageRequester("", Str(time1)+" "+Str(time2))
Resultate sind etwa 1 zu 2 in Geschwindigkeit!
greetz
remi

Verfasst: 19.02.2005 00:05
von Helle
@remi: Da FASM die Direktive align bietet habe ich mal einige Tests mit
"!ALIGN 4" gemacht und war mit den Werten sehr zufrieden!
Weitere Optimierungen: Da LEA ausser dem Faktor 2 auch noch 4 und 8
zulässt geht auch z.B. LEA EAX,[EAX*4+EAX] für Multiplikation mit 5.
Gruss
Helle

Verfasst: 19.02.2005 00:29
von remi_meier
@Helle: Hm.. Kannst du mir erklären, wie ich dieses !ALIGN 4 anwenden muss? Werd aus der knappen Fasm Hilfe nicht schlau...
Das mit LEA werd ich noch hinzufügen :)

cu
remi

EDIT: ist das normal, dass LEA auch mit eax*3 also a*4 geht?

Verfasst: 19.02.2005 09:24
von Helle
Einfach "!ALIGN 4" als Zeile einfügen! In deinem NOP-Beispiel alle NOP´s
entfernen und einmal diese Zeile rein. Warum soll man sich Arbeit machen, wenn der Assembler das selbst kann? :D
Das mit LEA hat mich selbst überrascht. Bei mir wurden die Faktoren
0, 1, 2, 3, 4, 7(!) und 8 vom FASM akzeptiert. Mein alter TASM kennt 3 und 7 nicht. Habe in der Eile auch im Internet nichts Brauchbares dazu
gefunden. Möglicherweise ein neues Feature ab irgendeiner Prozessor-
Familie. 3 und 7 machen ja Sinn für Multiplikationen mit 4 oder 8. Ob´s
schneller als SHL ist teste ich mal nach dem Frühstück.

Verfasst: 19.02.2005 10:59
von Helle
Anbei ein kleiner Test für Multiplikation mit 4:
Code:
;------------- Test Multiplikation mit 4 ------------
!ALIGN 4

#N = 49999999

a = 5
time1 = ElapsedMilliseconds()
For z = 1 To #N
!MOV Eax,[v_a]
!LEA Eax,[Eax*3+Eax]
!MOV [v_a],Eax
Next
time1 = ElapsedMilliseconds() - time1

a = 5
time2 = ElapsedMilliseconds()
For z = 1 To #N
!MOV Eax,[v_a]
!LEA Eax,[Eax*4]
!MOV [v_a],Eax
Next
time2 = ElapsedMilliseconds() - time2

a = 5
time3 = ElapsedMilliseconds()
For z = 1 To #N
!MOV Eax,[v_a]
!SHL Eax,2
!MOV [v_a],Eax
Next
time3 = ElapsedMilliseconds() - time3

MessageRequester("", Str(time1)+" "+Str(time2)+" "+Str(time3))

Alle Zeiten sind in etwa gleich. Die Problematik mit dem Speicher-
Alignment erkennt man, wenn ALIGN an anderen Stellen eingefügt wird!

Verfasst: 19.02.2005 12:58
von DarkDragon
freedimension hat geschrieben:
ts-soft hat geschrieben:@DarkDragon
lässt sich sowieso mit der neuen PB beta nichtmehr nutzen
TailBite funktioniert bei mir einwandfrei mit PB 3.93 Beta 2
Kann ich bestätigen, hier auch alles im grünen Bereich.
Bei meinem Post hatte ich noch die Beta 1 und den Beta 2 Post nicht gelesen. ;)