SSE'de çok ince bir sorunla karşılaşıyorum. Bu durumda, SSE ile ışın izleyicimi optimize etmek istiyorum, böylece SSE ile performansın nasıl iyileştirileceğine dair temel bir his elde edebiliyorum.SSE boru hattı temizlemesi nasıl yapılır?
Bu çok işlevle başlamak istiyorum.
Vector3f Add(const Vector3f& v0 , Vector3f& v1);
(Aslında ben basitlik için burada gösterilir eklenmesi, ilk Çapraz Çarpım optimize etmeye çalıştı ve bunu kendi ışın zerresinin darboğaz değil biliyorduk.) Burada
yapı tanımının bir parçasıdır :struct Vector3f
{ union { struct{ float x ; float y ; float z; float reserved; }; __m128 data; };
konudur SSE bu çok beyanı ile aynı hizada kayıt olacak, derleyici başka kullanımlar için olanlar sse kayıt tutacak kadar akıllı değildir. Aşağıdaki bildirimle, yıkamadan kaçınılır.
__m128 Add(__m128 v0_data, __m128 v1_data);
Bu davada bu yolla gidebilir, ancak dört __m128 verileri tutan Matrix için çirkin tasarım olacaktır. Ve operatörünüzün Vector3f'in kendisinde ancak veri üzerinde çalışmasına izin veremezsiniz :(.
En rahatsız edici şey, daha üst düzey kodunuzu değiştirmek için her yerde değişmek zorunda olmanızdır. GGD kesinlikle büyük bir oyun motoru gibi büyük bir şey için hiçbir seçenek aracılığıyla çalıştığını önce, kod büyük miktarda değiştireceğiz.
SSE kızarma kayıt kaçınarak olmadan, gücünü bu yararsız yıkama komutu tarafından boşaltılır edilecektir SSE yararsız, sanırım vermektedir.
Vector3f bellekte hizalanmış 16 bit olduğunu belirtmeyi unuttum. – JerryCao1985
Ara sıra nezaket nezaketini unutmayın. –
@ JerryCao1985 Bunu bir yorum olarak eklemek yerine, bunu düzenleyerek söz konusu kişiden doğrudan söz edebilirsiniz. – Borgleader