eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingcpu shading by sse intrinsicsRe: cpu shading by sse intrinsics
  • Data: 2014-06-30 12:16:29
    Temat: Re: cpu shading by sse intrinsics
    Od: firr <p...@g...com> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    W dniu poniedziałek, 30 czerwca 2014 10:42:48 UTC+2 użytkownik Wojciech Muła napisał:
    > On Saturday, June 28, 2014 12:48:05 PM UTC+2, firr wrote:
    >
    > > chodzi o dwie rzeczy
    >
    > >
    >
    > > 1) jak ew przyspieszyc czy ladniej to zapisac z poziomu c
    >
    >
    >
    > Nie licz za każdym razem normalnej, ani jej nie normalizuj (to
    >
    > pierwiastek i trzy dzielenia - dwie najwolniejsze operacje na CPU).
    >
    > Shader nie powinien liczyć normalnej, a jedynie intensywność światła.
    >
    > Mieszasz odpowiedzialności i wychodzi sieczka.
    >
    >
    >
    > > 2) jak przepisac to i przyspieszyc przy pomocy sse intrinsics (uzywam mingw gcc
    4.7 wiec tak zeby poszlo pod tym kompilatorem)
    >
    >
    >
    > Najpierw dobrze napisz wersję skalarną, potem zastanawiaj się jak
    >
    > ją przyspieszyć SIMD-ami. Zresztą wątpliwe, czy zrobisz to lepiej niż
    >
    > kompilator, popatrz na http://locklessinc.com/articles/vectorize/.
    >
    >

    nie przypuszczam zeby bylo to watpliwe, ztcw te wektoryzery potrafia wykonac ledwie
    szczatkowe
    operacje

    co do przepisywania na razie chyba porobie troszke prostsze testy (bo w tych
    wiekszych troche sie gubie) - zobacze np czy zwykle obracanie wektorow coskolwiek
    przyspiesza
    (nie spodziewam sie za wiele ale trzeba sprawdzic)

    cos w stylu - pseudokod roboczy

    float modelRight_x;
    float modelRight_y;
    float modelRight_z;

    float modelUp_x;
    float modelUp_y;
    float modelUp_z;

    float modelDir_x;
    float modelDir_y;
    float modelDir_z;


    float normal_x[100*1000];
    float normal_y[100*1000];
    float normal_z[100*1000];

    float n_x[100*1000];
    float n_y[100*1000];
    float n_z[100*1000];

    for(int i=0; i<100*1000; i++)
    {
    normal_x[i] = n_x[i]*modelRight_x + n_y[i]*modelRight_y + n_z[i]*modelRight_z;
    normal_y[i] = n_x[i]*modelUp_x + n_y[i]*modelUp_y + n_z[i]*modelUp_z;
    normal_z[i] = n_x[i]*modelDir_x + n_y[i]*modelDir_y + n_z[i]*modelDir_z;
    }

    float4 modelRight_4x = populate(modelRight_x);

    for(int i=0; i<100*1000; i+=4)
    {
    add_ps(

    normal_x[i] = add_ps(
    mul_ps(n_x, modelRight_x),
    mul_ps(n_y, modelRight_y) ),
    mul_ps(n_z, modelRight_z))

    normal_y[i] = add_ps(
    mul_ps(n_x, modelUp_x),
    mul_ps(n_y, modelUp_y) ),
    mul_ps(n_z, modelUp_z))

    normal_z[i] = add_ps(
    mul_ps(n_x, modelDir_x),
    mul_ps(n_y, modelDir_y) ),
    mul_ps(n_z, modelDir_z))

    }

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

  • 30.06.14 12:27 firr
  • 02.07.14 01:20 firr
  • 02.07.14 18:12 Edek
  • 02.07.14 20:13 firr

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: