Ci sono diverse soluzioni per questo.
Uno è basato su C++, dove si creano più classi, in genere si implementa una classe di interfaccia e si utilizza una funzione di fabbrica per fornire un oggetto della classe corretta.
ad es.
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;
}
}
Oppure, come suggerito sopra, è possibile utilizzare le librerie condivise che dispongono di un'interfaccia comune e caricare dinamicamente la libreria che è giusto.
Ovviamente, se si implementa la classe di base Matrix come classe "normale", è possibile eseguire il perfezionamento graduale e implementare solo le parti effettivamente trovate utili e fare affidamento sulla classe di base per implementare le funzioni in cui la prestazione non è t altamente analitico.
Modifica: Parli di inline e penso che tu stia osservando il livello sbagliato di funzione, se così fosse. Vuoi funzioni abbastanza grandi che facciano qualcosa su un bel po 'di dati. In caso contrario, tutti i tuoi sforzi saranno spesi per preparare i dati nel formato corretto, quindi fare alcune istruzioni di calcolo e quindi riportare i dati in memoria.
Vorrei anche considerare come si memorizzano i dati. Stai memorizzando set di array con X, Y, Z, W o stai memorizzando molti X, molti Y, molti Z e molti W in array separati [presumendo che stiamo facendo calcoli 3D]? A seconda di come funziona il tuo calcolo, potresti scoprire che fare l'uno o l'altro modo ti darà il miglior beneficio.
Ho fatto un bel po 'di SSE e 3DNow! ottimizzazioni qualche anno fa, e il "trucco" è spesso più relativo al modo in cui si memorizzano i dati in modo da poter facilmente afferrare un "fascio" del giusto tipo di dati in un colpo solo. Se i dati sono archiviati nel modo sbagliato, si sprecherà molto del "tempo di swizzling dei dati" (spostando i dati da un modo di memorizzazione a un altro).
Nessuna menzione della piattaforma? Alcune piattaforme rifiuteranno di eseguire codice usando avx anche se sapete che quelle istruzioni non verranno mai chiamate. Alcune piattaforme hanno ifunc per selezionare tra diverse implementazioni in fase di esecuzione. Alcune piattaforme cercano librerie condivise in percorsi che dipendono dalle capacità. –