여러 가지 해결책이 있습니다.
하나는 C + +를 기반으로 여러 클래스를 만듭니다. 일반적으로 인터페이스 클래스를 구현하고 팩토리 함수를 사용하여 올바른 클래스의 객체를 제공합니다.
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;
}
}
또는 위의 제안, 당신은 공통 인터페이스를 가지고 있고, 동적으로 적합한 라이브러리를로드 공유 라이브러리를 사용할 수 있습니다.
물론 "Matrix 기본 클래스를"일반 "클래스로 구현하면 단계별로 미세 조정을 수행하고 실제로 찾은 부분 만 구현하면 효과적이며 기본 클래스를 사용하여 성능이 ' 고도로 craticial.
편집 : 당신은 인라인에 대해 이야기합니다. 나는 그런 경우에 잘못된 수준의 기능을보고 있다고 생각합니다. 꽤 많은 데이터를 처리하는 상당히 큰 기능을 원합니다. 그렇지 않으면 올바른 형식으로 데이터를 준비한 다음 몇 가지 계산 지침을 수행하고 데이터를 다시 메모리에 저장하는 데 모든 노력을 기울일 것입니다.
데이터를 저장하는 방법에 대해서도 고려할 것입니다. X, Y, Z, W가있는 배열 집합을 저장하고 있습니까? 아니면 X를 많이, Y를 많이, Z를 많이, W를 많이 저장하고 있습니까? [3D 계산을한다고 가정 할 때]? 계산 방법에 따라 한 가지 방법이나 다른 방법을 사용하면 최상의 이점을 얻을 수 있습니다.
나는 SSE와 3DNow를 꽤 잘 했어! 최적화는 몇 년 전의 일이며, "트릭"은 종종 데이터를 저장하는 방법에 대한 것이므로 한 번에 올바른 종류의 데이터 "묶음"을 쉽게 얻을 수 있습니다. 데이터를 잘못 저장하면 많은 시간을 낭비하게됩니다 (데이터를 한 가지 저장 방식에서 다른 방식으로 이동).
플랫폼에 대한 언급이 없습니까? 일부 플랫폼에서는 명령이 호출되지 않을지라도 avx를 사용하여 코드 실행을 거부합니다. 일부 플랫폼에는 런타임에 여러 구현 중에서 선택하는 ifunc가 있습니다. 일부 플랫폼은 기능에 의존하는 경로에서 공유 라이브러리를 찾습니다. –