[ glorius @ 04.09.2005. 19:13 ] @
Zanima me koliko je korisno koristiti asembler u C++ ( __asm ... ) ili celih funkcija odradjenih u asembleru sa OpenGL-om.

Da li vredi uciti asembler zbog ubrzanja programa.

U stvari, znam da je asembler brzi, ali sa danasnjim funkcijama grafickih kartica, da li je potrebno neke "sporije" radnje prebaciti u asembler code?
[ yooyo @ 05.09.2005. 00:00 ] @
Zavisi od podele posla. Ono sto CPU radi treba sto bolje optimizovati, a GPU deo posla treba maksimalno prilagoditi hardveru. Npr.. mozes maksimalno da se trudis da ubrzas neki deo programa ali problem je npr. u transferu podataka na karticu i neces dobiti ocekivano ubrzanje.

Da bi stekao bolju sliku sta najvise utice na performanse pogledaj dokumentaciju na:
http://developer.nvidia.com/ob...ggraph_2005_presentations.html
http://developer.nvidia.com/object/perf_docs_by_date.html

Sto se asemblera tice... ima smisla pisati SSE optimizovane matematicke rutine ako radis veliki deo posla na CPU.

yooyo
[ Reljam @ 05.09.2005. 00:06 ] @
Yooyo je u pravu, ali u velikoj vecini slucajeva nece biti potrebna optimizacija u vidu asemblera, vec algoritamska optimizacija. Asm programiranje je danas vrlo retko u igrama.
[ tosa @ 05.09.2005. 02:19 ] @
Dodao bih jos da ako ne znas 100% sta radis, lako mozes da napises kod koji je
sporiji od onoga sto bi generisao kompajler. Posebno sa danasnjim procesorima
i svim mogucim cache-related problemima.
[ Filip Strugar @ 06.09.2005. 01:07 ] @
I ja da ponovim vec receno: Mani se asemblera i zaboravi na pojam low-level 'ubrzavanja programa' dok ti stvarno konkretno ne zatreba :)
Asembler nikada neces iskoristiti u ovoj oblasti - osim u jako retkim slucajevima - npr brzi int cast (ali za to ti opet ne treba nikakvo znanje asemblera) ili sto je yooyo rekao SSE, ako ti se bas nekad zabode da npr radis optimizaciju CPU vertex processinga na vec skoro-zavrsenom projektu, sto ti stvaaaaarno verovatno nikad nece trebati :)
[ tosa @ 07.09.2005. 07:55 ] @
Da dodam samo da i u C++-u mozes da uradis dosta toga sto je vezano za
hardware, ako znas kako isti funkcionise. Toliko ima bitnijih stvari od low-level
optimizacije da ona postaje "deprecated" :)
Organizovati strukture tako da imaju cache-friendly velicinu, manje "skakanja" po
memoriji itd.

Primera radi:
Code:
memcpy( &matrix1, &matrix2, sizeof(matrix) );

je mnogo sporije od:
Code:
for (int i=0; i<16; ++i) matrix1[i] = matrix2[i];

sto opet moze biti sporije od:
Code:
for (int i=15; i>=0; --i) matrix1[i] = matrix2[i];

[ mloh2 @ 09.09.2005. 14:07 ] @
Ja podrzavam najsporiju varijantu :)
matrix1=matrix2;
[ tosa @ 09.09.2005. 16:40 ] @
Pazi, to moze da bude i jedna od boljih, ako je kompajler dobar, mada se ne bih
oslonio na to :)
[ Ognjen Djukic @ 14.09.2005. 13:53 ] @
Zasto je:
memcpy( &matrix1, &matrix2, sizeof(matrix) );

sporije od:
for (int i=0; i<16; ++i) matrix1 = matrix2;

?
Thanks.
[ tosa @ 14.09.2005. 14:32 ] @
Zato sto memcpy mora da proveri da li se preklapaju blokovi memorije koje
kopiras. Isto tako na brzinu kopiranja utice alignment tih blokova memorije
i naravno da li je ta memorija kesirana.