Es gibt mehrere Lösungen dafür.
Einer basiert auf C++, wo Sie mehrere Klassen erstellen würden - normalerweise implementieren Sie eine Interface-Klasse und verwenden eine Factory-Funktion, um Ihnen ein Objekt der korrekten Klasse zu geben.
z.B.
class Matrix
{
virtual void Multiply(Matrix &result, Matrix& a, Matrix &b) = 0;
...
};
class MatrixPlain : public Matrix
{
void Multiply(Matrix &result, Matrix& a, Matrix &b);
};
void MatrixPlain::Multiply(...)
{
... implementation goes here...
}
class MatrixSSE: public Matrix
{
void Multiply(Matrix &result, Matrix& a, Matrix &b);
}
void MatrixSSE::Multiply(...)
{
... implementation goes here...
}
... same thing for AVX...
Matrix* factory()
{
switch(type_of_math)
{
case PlainMath:
return new MatrixPlain;
case SSEMath:
return new MatrixSSE;
case AVXMath:
return new MatrixAVX;
default:
cerr << "Error, unknown type of math..." << endl;
return NULL;
}
}
Oder, wie oben vorgeschlagen, können Sie gemeinsam genutzte Bibliotheken verwenden, die eine gemeinsame Schnittstelle haben und dynamisch die Bibliothek laden, die richtige ist.
Natürlich, wenn Sie die Matrix-Basisklasse als Ihre "einfache" Klasse implementieren, können Sie stufenweise verfeinern und nur die Teile implementieren, die Sie tatsächlich finden, und sich auf die Basisklasse verlassen, um die Funktionen zu implementieren, wo Leistung nicht ist. t hochkarätig.
Edit: Sie sprechen über Inline, und ich denke, Sie sind auf der falschen Ebene der Funktion suchen, wenn das der Fall ist. Sie möchten ziemlich große Funktionen, die etwas mit ziemlich vielen Daten machen. Sonst wird Ihre gesamte Anstrengung darauf verwendet, die Daten in das richtige Format zu bringen und dann ein paar Rechenanweisungen zu machen und die Daten dann wieder in den Speicher zu schreiben.
Ich würde auch darüber nachdenken, wie Sie Ihre Daten speichern. Speichern Sie Sets eines Arrays mit X, Y, Z, W oder speichern Sie viele X, viele Y, viele Z und viele W in separaten Arrays (vorausgesetzt, wir machen 3D-Berechnungen)? Abhängig davon, wie Ihre Berechnung funktioniert, können Sie feststellen, dass Sie den einen oder anderen Vorteil haben.
Ich habe ein gutes Stück SSE und 3DNow gemacht! Optimierungen vor einigen Jahren, und der "Trick" ist oft mehr darüber, wie Sie die Daten speichern, damit Sie auf einfache Weise ein "Bündel" der richtigen Art von Daten auf einmal erfassen können. Wenn Sie die Daten falsch gespeichert haben, verschwenden Sie viel Zeit mit dem "Swizzling von Daten" (Daten werden von einer Speichermethode auf eine andere übertragen).
Keine Erwähnung der Plattform? Einige Plattformen werden es ablehnen, Code mit avx auszuführen, selbst wenn Sie wissen, dass diese Anweisungen niemals aufgerufen werden. Einige Plattformen haben zur Laufzeit die Auswahl zwischen mehreren Implementierungen. Einige Plattformen suchen nach freigegebenen Bibliotheken in Pfaden, die von den Funktionen abhängen. –