Forum Sveta kompjutera

Nazad   Forum Sveta kompjutera > Test Run > Programiranje

Programiranje Programski jezici, tehnike, alatke...

Odgovor
 
Alatke vezane za temu Vrste prikaza
Stara 24.7.2011, 21:32   #1
Geomaster
V.I.P. Programiranje
 
Član od: 28.6.2007.
Lokacija: Beograd
Poruke: 2.342
Zahvalnice: 2.836
Zahvaljeno 1.047 puta na 507 poruka
Slanje poruke preko MSN-a korisniku Geomaster Slanje poruke preko Skypea korisniku Geomaster
Određen forumom Memory alignment i prosleđivanje po vrednosti - kolika je prepreka?

Jedno kratko pitanje.
Imam klasu sa nizom koji je definisan tako da se alignuje na 128-bitnoj (16-bajtnoj) granici. Ovo mi je potrebno zbog SSE optimizacija koje ovo zahtevaju ali znaju da budu i do 300% brže od običnih verzija. Međutim, otkrio sam da kompajler ne može da prosledi ovakvu klasu po vrednosti (što je i logično s obzirom na calling konvenciju). Primer:
Kod:
class Test
{
public:
     __attribute__ ((aligned (16))) float x[4];
};

void f(Test a) // ovde se pojavljuje greška
{
     ...
}
Sad, meni ovo ne predstavlja problem pošto uvek mogu da prosleđujem po referenci. Međutim, pošto pišem biblioteku, da li je ok da to bude tako tj. da se tipovi kao što su Matrix, Vector, Quaternion itd. ne mogu prosleđivati po vrednosti? Stvarno ne bih hteo da brišem alignment zato što bih izgubio dragocene dobitke u brzini, ali ako bi ovo predstavljalo neki veći problem krajnjem korisniku onda bih ipak ukinuo SSE podršku.
Geomaster je offline   Odgovor sa citatom ove poruke
Stara 25.7.2011, 14:26   #2
Belphegor
V.I.P. Programiranje
 
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
Određen forumom Re: Memory alignment i prosleđivanje po vrednosti - kolika je prepreka?

Nisam se jos "zezao" sa specificnim procesorskim instrukcijama i alignment-om tako da neznam konkretno zasto nece da funkcionise kad se prosledjujes po vrednosti. Evo jednog "objasnjenja" sa GameDev-a sto sam uspeo da nadjem za sad:
Citat:

Kod:
void Function( D3DXMATRIXA16 mx );
Parameters are passed by being pushed on the stack and popped off later, so the compiler can't guarantee the parameter (matrix) will be aligned on a 32-byte boundary. When passing by reference, on the other hand, the 'address' is what gets pushed on and popped off the stack, so there's no problem in alignment.
Offtopic: Izgleda da koristis GCC kompajler?
Belphegor je offline   Odgovor sa citatom ove poruke
Stara 25.7.2011, 15:00   #3
Geomaster
V.I.P. Programiranje
 
Član od: 28.6.2007.
Lokacija: Beograd
Poruke: 2.342
Zahvalnice: 2.836
Zahvaljeno 1.047 puta na 507 poruka
Slanje poruke preko MSN-a korisniku Geomaster Slanje poruke preko Skypea korisniku Geomaster
Određen forumom Re: Memory alignment i prosleđivanje po vrednosti - kolika je prepreka?

Jasno je meni zašto je tako nešto nemoguće (u stvari, tehnički bi bilo moguće da prvi parametar na steku bude na 16-bajtnoj granici ali ne verujem da se to koristi), ali ne znam da li bi ovo predstavljalo prepreku eventualnim korisnicima ove biblioteke?

Ne, koristim Microsoft Visual C++ kao IDE i debug kompajler, ali Release verzije uvek kompajlujem sa GCC-om (mingw na Windowsu) zato što radi bolje optimizaciju.
Geomaster je offline   Odgovor sa citatom ove poruke
Stara 25.7.2011, 16:21   #4
Belphegor
V.I.P. Programiranje
 
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
Određen forumom Re: Memory alignment i prosleđivanje po vrednosti - kolika je prepreka?

Citat:
Geomaster kaže: Pregled poruke
...ali ne znam da li bi ovo predstavljalo prepreku eventualnim korisnicima ove biblioteke?
Sad sam probao sa std::vector kontenerom:

Kod:
#include <vector>

class vec4
{
public:
    __m128 m;
};

class FooNode
{
public:
    vec4 v;
};

int main()
{
    FooNode fn;
    std::vector<FooNode> v;
    v.push_back(fn);

    return 0;
}
output:
Citat:
error C2719: '_Val': formal parameter with __declspec(align('16')) won't be aligned
Belphegor je offline   Odgovor sa citatom ove poruke
Stara 25.7.2011, 18:52   #5
EclipsE
Starosedelac
 
Član od: 16.4.2006.
Lokacija: Scary Movie Reputacija: ■■□
Poruke: 1.337
Zahvalnice: 378
Zahvaljeno 279 puta na 196 poruka
Slanje poruke preko Skypea korisniku EclipsE
Određen forumom Re: Memory alignment i prosleđivanje po vrednosti - kolika je prepreka?

Pa znas kako, i Bullet koristi alignment pa eto, dosta ljudi ga koristi

Sto se tice std::vectora, evo sta sam pronasao: http://bulletphysics.org/Bullet/phpB...php?f=9&t=3638

Citat:
Bullet uses btAlignedObjectArray as std::vector replacement due to the buggy Microsoft STL implementation.
Buggy Microsoft STL implementation? Microsoft, you have failed us again.
EclipsE je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku EclipsE na korisnoj poruci:
Belphegor (25.7.2011)
Stara 25.7.2011, 20:16   #6
Belphegor
V.I.P. Programiranje
 
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
Određen forumom Re: Memory alignment i prosleđivanje po vrednosti - kolika je prepreka?

Ja ne bi' bas rekao da je "buggy", bolje je reci nedostatak (nije da ih branim nesto ).
Vidim da predlazu drugu implementaciju STL-a ali me mrzi sad da probam .
Belphegor je offline   Odgovor sa citatom ove poruke
Stara 25.7.2011, 21:48   #7
Geomaster
V.I.P. Programiranje
 
Član od: 28.6.2007.
Lokacija: Beograd
Poruke: 2.342
Zahvalnice: 2.836
Zahvaljeno 1.047 puta na 507 poruka
Slanje poruke preko MSN-a korisniku Geomaster Slanje poruke preko Skypea korisniku Geomaster
Određen forumom Re: Memory alignment i prosleđivanje po vrednosti - kolika je prepreka?

Postoje i alternative, na primer korišćenje dinamičke alokacije aligned memorije pomoću posix_memalign ili _aligned_malloc (za Win), pa ću videti da to uradim (u konstruktoru alociram a u destruktoru samo dealociram, u slučaju da se koristi alignment).

A da, M$ stvarno ima faličnu implementaciju vektora, a o novim C++0x kontejnerima da ne govorim... Ali su IDE i debugger odlični.
Geomaster je offline   Odgovor sa citatom ove poruke
Odgovor

Bookmarks sajtovi

Alatke vezane za temu
Vrste prikaza

Vaš status
Ne možete postavljati teme
Ne možete odgovarati na poruke
Ne možete slati priloge uz poruke
Ne možete prepravljati svoje poruke

BB kod: uključeno
Smajliji: uključeno
[IMG] kod: uključeno
HTML kod: isključeno


Slične teme
tema temu započeo forum Odgovora Poslednja poruka
Gothic III Guardian Role-Play 1579 25.5.2020 18:56
[Matična ploča] Asus M4A89GTD Pro veseliburek Opisi, recenzije i testovi 25 12.5.2011 21:26


Sva vremena su po Griniču +2 h. Sada je 2:09.


Powered by vBulletin® verzija 3.8.7
Copyright ©2000–2024, vBulletin Solutions, Inc.
Hosted by Beograd.com