eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programming[asm/c] optymalizacja elementarnego raytraceraRe: [asm/c] optymalizacja elementarnego raytracera
  • Data: 2012-08-03 17:46:09
    Temat: Re: [asm/c] optymalizacja elementarnego raytracera
    Od: " fire" <f...@W...gazeta.pl> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    M.M. <m...@W...gazeta.pl> napisał(a):

    > f-i-r <f...@W...gazeta.pl> napisał(a):
    > > hehe, tn poziom glabienia mnie przygnebia i na pewno nie pogadamy
    > > na takim poziomie ;) nie umiesz powiedzec nic nt (tematem jest
    > Ale rację trzeba przyznać, że jako punktu wyjścia powinieneś użyć
    > asemblera wygenerowanego przez lepszy kompilator, np. GCC, Microsoft,
    > Intel, słyszałem też, że jest AMD i IBMa ale nigdy nie widziałem.

    asm is kool, w sumie widze trzy domeny optymalizacji tutaj : c-optymization
    (przerabianie i przestawianie linijek), way-optymization (tj 'algorytmiczna'
    - np ew jakies geometryczne zaleznosci i struktury pomocniecze w stylu
    cache) i asm-optymization; dwie pierwsze umiem robic ale w asmie stoje
    kiepsko o tyle to by wlasnie nalezalo przytrenowac; ( w bcc niestety nieco
    niewygodnie sie eksperymentuje z asmem, a i wiedzy 'ksiazkowej' nt asma nie
    mam w tej chwili za duzej)
    koles na so podal ew wzorzec wersji 'intersect ray sphere' pod xmm ->

    inline void intersect4RaysSphere(
    float* rOx, float* rOy, float* rOz,
    float* rVx, float* rVy, float* rVz,
    float sOx, float sOy, float sOz,
    float sR)
    {
    // calculate Q
    movss xmm0, sOx
    movss xmm1, sOy
    movss xmm2, sOz
    shufps xmm0, xmm0, 0
    shufps xmm1, xmm1, 0
    shufps xmm2, xmm2, 0
    subps xmm0, [rOx]
    subps xmm1, [rOy]
    subps xmm2, [rOz]
    // calculate pow(dot(Q, rV), 2) in xmm3
    movaps xmm3, [rVx]
    movaps xmm4, [rVy]
    movaps xmm5, [rVz]
    mulps xmm3, xmm0
    mulps xmm4, xmm1
    mulps xmm5, xmm2
    addps xmm3, xmm4
    addps xmm3, xmm5
    movaps xmm4, xmm3
    mulps xmm3, xmm3
    // calculate pow(length(Q), 2)
    // there's no point in taking the square root only to then square it
    mulps xmm0, xmm0
    mulps xmm1, xmm1
    mulps xmm2, xmm2
    addps xmm0, xmm1
    addps xmm0, xmm2
    // calculate d
    movss xmm1, sR
    mulss xmm1, xmm1
    shufps xmm1, xmm1, 0
    subps xmm0, xmm3
    subps xmm1, xmm0
    sqrtps xmm1, xmm1
    // test for intersection
    // at this point:
    // xmm3 = v * v
    // xmm4 = v
    // xmm1 = sqrt(d)
    movaps xmm0, [minus1] // memory location with { -1.0, -1.0, -1.0, -1.0 }
    subps xmm4, xmm1
    // get a mask of d's smaller than 0.0
    psrad xmm1, 31
    // select -1 if less than zero or v*v - d if >= 0
    andps xmm0, xmm1
    andnps xmm1, xmm4
    orps xmm0, xmm1
    ret
    }

    narazie chyba zaczne od mniejszych drobiazgow, typu 'normalize' na fpu,
    albo nawet mniej - porientuje sie w tutorialach ;-) ale tak czy owak
    zadanie nauczenia sie asma chyba mnie nie ominie





    --
    Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: