Aktív témák

  • P.H.

    senior tag

    Eddig sosem sikerült igazán hatékonyan kihasználnom a prefetch-utasításokat, most viszont a legjobbkor, a megfelelő algoritmusnál sikerült ráérezni: az egész kód elejére (amikor még nem függ tőle semmi egy ideig) áttéve a legvéletlenszerűbb betöltést és előbetöltve az az által címzett adatot kb. 20% gyorsulást eredményezett a teljes lefutási időt tekintve.

    Így, ameddig a @down ciklus (előre meg nem jósolható számú, de biztosan 1-21 közötti) lefutása megtörténik, addig az esetek egy nem elhanyagolható részében kényelmesen megérkezik az utána következő @block-rész és @connects-ciklus által feldolgozott adat az L1D-be.

    Így a program mostantól legalább Pentium3-at igényel az SSE miatt.

    @entry:
    mov edi,[esi-08h+__PRIO]
    mov ecx,[esi+__QUEUESIZE]
    ---> mov ebx,[esi+__PACKADAT2]
    or edx,-1
    mov ebp,[esi+ecx*08h+__PRIO]
    ---> mov ebx,[ebx+edi*04h]
    cmp edi,[esp+__STOPINDEX]
    jz @finish
    sub ecx,edx
    mov [esi+edi*08h+__CONN],edi
    jg @finish
    mov [esi+__QUEUESIZE],ecx
    jz @block
    mov [esi+__HEADER],ebx
    ---> prefetchnta [ebx]
    @down:
    mov ecx,edx
    add edx,edx
    mov ebx,ebp
    cmp edx,[esi+__QUEUESIZE]
    jl @insertdown
    mov eax,[esi+edx*08h+00h+__PRIO]
    mov ebx,[esi+edx*08h-08h+__PRIO]
    mov eax,[esi+eax*08h+__DIST]
    jz @child
    mov ebx,[esi+ebx*08h+__DIST]
    cmp eax,ebx
    cmovnbe eax,ebx
    lea ebx,[edx-01h]
    cmovnbe edx,ebx
    @child:
    cmp [esi+ebp*08h+__DIST],eax
    mov ebx,[esi+edx*08h+__PRIO]
    cmovbe ebx,ebp
    @insertdown:
    mov [esi+ecx*08h+__PRIO],ebx
    mov [esi+ebx*08h+__CONN],ecx
    jnbe @down
    mov ebx,[esi+__HEADER]
    @block:
    movzx eax,byte ptr [ebx+STRUCT0.FIELD0]
    movzx ecx,byte ptr [ebx+STRUCTO.FIELD1]
    add ebx,STRUCT0SIZE-STRUCT1SIZE
    cmp byte ptr [esp+WORKAREA0+eax],00h
    jz @entry
    mov [esi+__HEADER],ecx
    @connects:
    sub dword ptr [esi+__HEADER],01h
    js @entry
    add ebx,STRUCT1SIZE
    mov eax,[ebx+STRUCT1.FIELD0]
    movzx edx,byte ptr [ebx+STRUCT1.FIELD1]
    mov ecx,[esi+eax*08h+__CONN]
    test ecx,ecx
    jg @connects
    @label1:
    mov al,[ebx+STRUCT1.FIELD2]
    mov ebp,[ebx+STRUCT1.FIELD3]
    or al,[ebx+STRUCT1.FIELD4]
    and al,[esp+WORKAREA1+edx]
    cmp edx,11
    mov edx,10000*1000
    cmovnz edx,ebp
    add edx,ebp
    test al,al
    movzx eax,byte ptr [ebx+STRUCT1.FIELD5]
    cmovnz ebp,edx
    @label2:
    cmp al,0FFh
    jz @label3
    lea edx,[eax+eax*04h]
    add edx,edx
    sub eax,100
    cmovbe eax,edx
    cmp eax,[esp+ARGUMENT0]
    lea edx,[ebp+1000*1000]
    cmovna ebp,edx
    @label3:
    mov al,[ebx+STRUCT1.FIELD6]
    cmp al,[esp+ARGUMENT1]
    lea edx,[ebp+1000*1000]
    mov eax,[ebx+STRUCT1.FIELD0]
    cmova edx,ebp
    sub ebp,ebp
    cmp ecx,01h
    rcl ebp,01h
    neg ebp
    add edx,[esi+edi*08h+__DIST]
    or ebp,edx
    cmp [esi+eax*08h+__DIST],ebp
    jle @connects
    mov [esi+eax*08h+__DIST],edx
    neg eax
    cmp ecx,00h
    mov [esi+eax*08h+__PREV],edi
    jnz @moveup
    mov ecx,[esi+__QUEUESIZE]
    sub ecx,01h
    mov [esi+__QUEUESIZE],ecx
    @moveup:
    mov eax,ecx
    sar ecx,01h
    mov ebp,[esi+ecx*08h+__PRIO]
    cmp eax,-2
    ja @insertup
    cmp edx,[esi+ebp*08h+__DIST]
    @insertup:
    cmovae ebp,[ebx+STRUCT1.FIELD0]
    mov [esi+eax*08h+__PRIO],ebp
    mov [esi+ebp*08h+__CONN],eax
    jnae @moveup
    jmp @connects

Aktív témák