ASM - Hilfe bei Optimierung, x64?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
inc.
Beiträge: 348
Registriert: 27.10.2004 12:25

Re: ASM - Hilfe bei Optimierung, x64?

Beitrag von inc. »

cxAlex hat geschrieben:Ich optimiere gerade ein bisschen am Speed meines Hashtable-Includes und übersetzte einige Teile von Hand in Assembler da mir der PB - Compiler nicht genug optimiert. Nun hab ich aber irgendwie einen Fehler in meiner Übersetzung, sieht einer der ASM - Gurus wo ich danebenhaue, bzw. kenn jemand noch ein paar Tricks das ganze unter x64 zu beschleunigen?

Code: Alles auswählen

Macro _DoQuad()
  CompilerIf #True
    counter + 1
    hash + ((counter/2)*(counter/2))*(-1 + (r*2))
    hash%*hMap\Mapsize
    If hash<0 : hash + *hMap\Mapsize : EndIf
  CompilerElse
    mapsize = *hMap\mapsize
    !INC dword[p.v_counter]
    !MOV EAX,dword[p.v_counter]
    !MOV EBX, dword[p.v_mapsize]
    !MOV ECX,2
    !CDQ
    !DIV ECX ; counter/2
    !IMUL EAX,EAX ; ((counter/2)*(counter/2))
    !MOV ESI, dword[p.v_r]
    !ADD ESI, ESI ; r*2
    !DEC ESI ; -1
    !IMUL EAX,ESI
    !ADD EAX, dword[p.v_hash] ; hash + rest
    !CDQ
    !DIV EBX ;hash%*hMap\mapsize
    !MOV EAX, EDX
    ; If hash<0 : hash + *hMap\Mapsize : EndIf
    !AND EAX,EAX
    !JGE @f
    !ADD EDX,EBX
    !@@:
    !MOV dword[p.v_hash], EDX
    ; r ! 1
    !XOR dword[p.v_r], 1
  CompilerEndIf
EndMacro
Gruß, Alex
Du hast oben im PureBasic Code vergessen das Bitweises XOR "r ! 1" vorzunehmen, wie ich es im Originalcode kommentiert hatte und wie du es unten in der ASM Commented Ausgabe ebenfalls zeigst, denn das ist für die quadratische Sondierung obligatorisch. So wie oben funktioniert das Macro im Basic-Teil nicht. Und es ist wichtig, wenn du vom nativem Basic-Teil dies wie hier gewünscht von Grund auf in ASM übersetzen lassen möchtest.
http://purebasic-lounge.com/viewtopic.php?p=55177#55177
Hier der komplette "Kern" der quadratischen Sondierung aus dem o.g. Link:

Code: Alles auswählen

Else ; // quadratic probe 
  counter + 1 
  hash + ((counter/2)*(counter/2))*(-1 + (r*2)) 
  hash%*object\Mapsize 
  If hash<0 : hash + *object\Mapsize : EndIf 
  r ! 1 ; <------------------------------------// Swap bool !!
EndIf 
Hier gibts die OOP Option für PureBasic.
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: ASM - Hilfe bei Optimierung, x64?

Beitrag von Thorium »

Um das wirklich zu optimieren bräuchte man die ganze Schleife. Am besten ein lauffähiger Testcode damit man direkt die performance und funktionstüchtigkeit messen kann.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
inc.
Beiträge: 348
Registriert: 27.10.2004 12:25

Re: ASM - Hilfe bei Optimierung, x64?

Beitrag von inc. »

Thorium hat geschrieben:Um das wirklich zu optimieren bräuchte man die ganze Schleife. Am besten ein lauffähiger Testcode damit man direkt die performance und funktionstüchtigkeit messen kann.
Hier drüber in meinem Post findest du den Link mit der Hastabelle, dort kannst du die Schleife und den Algorhythmus der quadratischen Sondierung entnehmen.
Hier gibts die OOP Option für PureBasic.
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Re: ASM - Hilfe bei Optimierung, x64?

Beitrag von Helle »

Nachdem das düstere Geheimnis von r gelüftet wurde :mrgreen: , habe ich meinen Code (s.o.) überarbeitet. Ich dachte mir ja gleich, das es "nur" um Vorzeichen-Bildung geht.
Gruß
Helle
Antworten