Ho riscontrato un problema molto sottile su SSE. Qui è il caso, voglio ottimizzare il mio ray tracer con SSE in modo che possa avere un'idea di base su come migliorare le prestazioni con SSE.Come evitare il flusso della pipeline SSE?
Mi piacerebbe iniziare con questa stessa funzione.
Vector3f Add(const Vector3f& v0 , Vector3f& v1);
(In realtà ho cercato di ottimizzare CrossProduct prima, aggiungendo viene mostrato qui per semplicità ed ho capito che non è il collo di bottiglia del mio ray tracer.)
Ecco una parte della definizione della struct :
struct Vector3f
{ union { struct{ float x ; float y ; float z; float reserved; }; __m128 data; };
il problema è che ci saranno SSE registrati a filo con questa stessa dichiarazione, il compilatore non è abbastanza intelligente per tenere quelli registro SSE per ulteriori utilizzi. E con la seguente dichiarazione, evita il flussaggio.
__m128 Add(__m128 v0_data, __m128 v1_data);
posso andare con questo modo su questo caso, tuttavia sarebbe brutto disegno per Matrix che contiene quattro __m128 dati. E non è possibile che l'operatore lavori sullo stesso Vector3f ma sui suoi dati :((
La cosa più inquietante è che dovrai modificare il codice di livello superiore ovunque per adattare il cambiamento. tramite SSE non c'è assolutamente un'opzione per qualcosa di grande come un enorme motore di gioco, cambierai un'enorme quantità di codice prima che funzioni ..
Senza evitare lo svuotamento del registro SSE, la sua potenza verrà scaricata da quegli inutili comandi di lavaggio che rende inutile SSE, suppongo.
Ho dimenticato di menzionare che Vector3f ha 16 bit allineati in memoria. – JerryCao1985
Non dimenticare l'occasionale rossore di cortesia. –
@ JerryCao1985 Puoi dirlo direttamente nella tua domanda modificandolo, invece di aggiungerlo come commento. – Borgleader