Re: ASM - Hilfe bei Optimierung, x64?
Verfasst: 28.07.2010 21:58
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.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?
Gruß, AlexCode: 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
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