Ich entwerfe eine Reihe von Vector-Klassen in C++, die SSE (SIMD) unterstützen. Die Bediener wurden aus Bequemlichkeitsgründen überlastet. Beispiel für Klasse:Aufruf einer anderen Implementierung der Funktion basierend auf SSE-Funktionen
class vector2 {
public:
//...code
friend const vector2 operator+ (const vector2 & lhs, const vector2 & rhs);
//...code
protected:
float x, y;
};
Bisher hat die Methode überprüft, ob die CPU eine SSE (SIMD) Funktion hat, eine Klasse mit I PROCESSOR genannt erstellt, die diese Prüfung tut, wenn das Programm zur Laufzeit ausgeführt wird . Beispiel für Verfahren:
const vector2 operator+ (const vector2 & lhs, const vector2 & rhs) {
vector2 temp;
if(PROCESSOR.SSE) {
_asm { //... The "SSE WAY"
}
} else {
// The "NORMAL WAY"
}
return temp;
}
So wie Sie sehen können, wenn SSE verfügbar ist wird es die „SSE“ Weg laufen sonst wird es „normal“ laufen. Es ist jedoch sehr ineffizient, bei jedem Aufruf dieser Operation prüfen zu müssen, ob SSE verfügbar ist. Gibt es eine Möglichkeit, zwei Versionen einer Methode zu implementieren und nur die entsprechende Methode aufzurufen? Da meine PROCESSOR-Klasse nur einmal die SSE-Prüfung durchführt, gibt es eine Möglichkeit, meine Vektorklasse so einzustellen?
Die Tests selbst können langsam sein, aber diese SSE-Implementierung wird langsamer als Sie "Normal" -Code sein. SSE wurde entwickelt, um mit 16-Byte-Daten zu arbeiten, und ist nicht optimal für nicht ausgerichtete kleinere Typen. Optimieren Sie den Code nicht ohne Profiling. Dies würde Sinn machen, wenn Sie zwei Tabellen von Vektor2 summieren. Aber nur für einen, es wird definitiv langsamer sein. Wie man sagte, ist vorzeitige Optimierung die Wurzel allen Übels. Machen Sie Ihren Code funktionsfähig, dann profilieren Sie ihn und optimieren Sie ihn schließlich. – crazyjul