Geomaster
24.7.2011, 21:32
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:
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.
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:
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.