Aktív témák

  • P.H.

    senior tag

    Azt hiszem, elérhetetlen céljaim egyike, hogy a Netburst-öt megértsem...

    Prescott CeleronD: 630M clock (-4%)
    K8 Opteron: 585M clock (+4%)

    Csupán két utasítás sorrendjének felcserélésével (melynek mellékhatásaként a memóriaparaméteres PSHUFD 3 millió helyett 6 milliószor fut le).

    K8 analízis (túl sok a VectorPath):

    @copyarraySSE: //
    movd xmm0,[eax+04h] // 9/- FPUvector
    @zoomvertSSE: //
    mov [esp],edi // 3/1 p0/1/2 ALU 0/1/2
    xor ebx,ebx // 1/1 p0/1/2 ALU 0/1/2
    mov esi,[esp+_STRROWS] // 3/1 p0/1/2 ALU 0/1/2
    and edi,-64 // 1/1 p0/1/2 ALU 0/1/2
    sub edx,[esp+_STRLEFT] // 4/1 p0/1/2 ALU 0/1/2
    movd ebp,mm4 // 4/- FPUvector
    pshufd xmm0,xmm0,00000000b // 4/- FPUvector
    movd ecx,mm6 // 4/- FPUvector
    lea edi,[edi+40h] // 1/1 p0/1/2 ALU 0/1/2
    mov esi,[esi] // 3/1 p0/1/2 ALU 0/1/2
    cmovge edx,ebx // 1/1 p0/1/2 ALU 0/1/2
    movaps xmm1,[edi] // 4/- p5 FSTORE
    @sourceLEFT: //
    mov bl,[esi] // 4/1 p0/1/2 ALU 0/1/2
    add esi,02h // 1/1 p0/1/2 ALU 0/1/2
    add edx,ebx // 1/1 p0/1/2 ALU 0/1/2
    jle @sourceLEFT // 1/1 p0/1/2 ALU 0/1/2
    mov bl,[esi-01h] // 4/1 p0/1/2 ALU 0/1/2
    jmp @initpixelSSE // 1/1 p0/1/2 ALU 0/1/2
    @newpixelSSE: //
    movzx edx,word ptr [esi] // 1/1 p0/1/2 ALU 0/1/2
    add esi,02h // 1/1 p0/1/2 ALU 0/1/2
    movzx ebx,dh // 1/1 p0/1/2 ALU 0/1/2
    @initpixelSSE: //
    movaps xmm3,xmm0 // 2/1 p3/4 FADD/FMUL
    shl ebx,04h // 1/1 p0/1/2 ALU 0/1/2
    add dl,01h // 1/1 p0/1/2 ALU 0/1/2
    add ebx,[esp+_STRCOLORS] // 4/1 p0/1/2 ALU 0/1/2
    mulps xmm3,[ebx] // 7/2 p4 FMUL
    @prevHpixelSSE: //
    sub dl,01h // 1/1 p0/1/2 ALU 0/1/2
    pshufd xmm2,[ecx+00h],10010101b // 4/- FPUvector
    jz @newpixelSSE // 1/1 p0/1/2 ALU 0/1/2
    movaps xmm4,xmm3 // 2/1 p3/4 FADD/FMUL
    mov ebx,[ecx+00h] // 4/1 p0/1/2 ALU 0/1/2
    @pixelSSE: //
    mulps xmm4,xmm2 // 7/2 p4 FMUL
    test ebx,ebx // 1/1 p0/1/2 ALU 0/1/2
    @1pixelSSE: //
    addps xmm1,xmm4 // 5/2 p3 FADD
    jz @nextHpixelSSE // 1/1 p0/1/2 ALU 0/1/2
    movaps [edi],xmm1 // 3/- p5 FSTORE
    js @stepHelementSSE // 1/1 p0/1/2 ALU 0/1/2
    add edi,10h // 1/1 p0/1/2 ALU 0/1/2
    movaps xmm4,xmm3 // 2/1 p3/4 FADD/FMUL
    sub ebx,01h // 1/1 p0/1/2 ALU 0/1/2
    movaps xmm1,[edi] // 4/- p5 FSTORE
    jnz @1pixelSSE // 1/1 p0/1/2 ALU 0/1/2
    @nextHpixelSSE: //
    cmp ebx,[ecx+08h] // 4/1 p0/1/2 ALU 0/1/2
    pshufd xmm2,xmm2,11111111b // 4/- FPUvector
    lea ebx,[ebx-01h] // 1/1 p0/1/2 ALU 0/1/2
    jnz @pixelSSE // 1/1 p0/1/2 ALU 0/1/2
    @stepHelementSSE: //
    add ebp,ebx // 1/1 p0/1/2 ALU 0/1/2
    lea ecx,[ecx+10h] // 1/1 p0/1/2 ALU 0/1/2
    jnz @prevHpixelSSE // 1/1 p0/1/2 ALU 0/1/2
    mov edi,[esp] // 4/1 p0/1/2 ALU 0/1/2
    xor edx,edx // 1/1 p0/1/2 ALU 0/1/2
    @moreVrowsSSE: //
    add [eax+00h],ebx // 4/1 p0/1/2 ALU 0/1/2
    jns @cvtROW // 1/1 p0/1/2 ALU 0/1/2
    cmp ebx,[eax+00h] // 4/1 p0/1/2 ALU 0/1/2
    jnz @stepVelementSSE // 1/1 p0/1/2 ALU 0/1/2
    add ebp,[eax+08h] // 4/1 p0/1/2 ALU 0/1/2
    movd xmm0,ebp // 9/- FPUvector
    jnz @zoomvertSSE // 1/1 p0/1/2 ALU 0/1/2
    @stepVelementSSE: //
    add dword ptr [esp+_STRROWS],04h // 4/1 p0/1/2 ALU 0/1/2
    add [esp+_VSIZE],ebx // 4/1 p0/1/2 ALU 0/1/2
    lea eax,[eax+10h] // 1/1 p0/1/2 ALU 0/1/2
    jnz @copyarraySSE // 1/1 p0/1/2 ALU 0/1/2
    sub eax,10h // 1/1 p0/1/2 ALU 0/1/2
    mov [eax+00h],ebx // 3/1 p0/1/2 ALU 0/1/2
    @cvtROW: //
    mov esi,edi // 1/1 p0/1/2 ALU 0/1/2
    mov ebp,[esp+_INCREASE] // 4/1 p0/1/2 ALU 0/1/2
    and esi,-64 // 1/1 p0/1/2 ALU 0/1/2
    sub edi,ebp // 1/1 p0/1/2 ALU 0/1/2
    @cvtRGB: //
    add esi,40h // 1/1 p0/1/2 ALU 0/1/2
    cvtps2dq xmm1,[esi+00h] // 7/2 p5 FSTORE
    cvtps2dq xmm2,[esi+10h] // 7/2 p5 FSTORE
    cvtps2dq xmm3,[esi+20h] // 7/2 p5 FSTORE
    cvtps2dq xmm4,[esi+30h] // 7/2 p5 FSTORE
    movaps [esi+00h],xmm5 // 3/- p5 FSTORE
    packssdw xmm1,xmm2 // 2/- p3/4 FADD/FMUL
    movaps [esi+10h],xmm5 // 3/- p5 FSTORE
    packssdw xmm3,xmm4 // 2/- p3/4 FADD/FMUL
    movaps [esi+20h],xmm5 // 3/- p5 FSTORE
    packuswb xmm1,xmm3 // 2/- p3/4 FADD/FMUL
    movaps [esi+30h],xmm5 // 3/- p5 FSTORE
    movups [edi+ebp],xmm1 //
    add ebp,10h // 1/1 p0/1/2 ALU 0/1/2
    js @cvtRGB // 1/1 p0/1/2 ALU 0/1/2
    cmp [eax+00h],edx // 4/1 p0/1/2 ALU 0/1/2
    jz @moreVrowsSSE // 1/1 p0/1/2 ALU 0/1/2
    divss xmm0,xmm0 //16/- p4 FMUL
    jns @zoomvertSSE // 1/1 p0/1/2 ALU 0/1/2

    Nem látom Netburst-ön tovább az utat: a 19 clock/forráspixeles globális sebességet PSHUFD-MOVAPS-MULPS-ADDPS kvartett kifeszíti, a többi utasítás futását szinte teljesen elrejti.

    Most már kíváncsi vagyok, hogy egy P3-on mit lehet kihozni.

    [ Szerkesztve ]

    Arguing on the Internet is like running in the Special Olympics. Even if you win, you are still ... ˙˙˙ Real Eyes Realize Real Lies ˙˙˙

Aktív témák