elv*_*ode 7 c c++ compiler-construction sse avx
我正在为我的3D计算开发优化,现在我有:
plain使用标准C语言库的" "版本,SSE使用预处理器编译的优化版本#define USE_SSE,AVX使用预处理器编译的优化版本#define USE_AVX是否有可能在3个版本之间切换而无需编译不同的可执行文件(例如,具有不同的库文件并动态加载"正确"的文件,不知道inline函数是否"正确")?我也考虑过在软件中进行这种切换的表现.
有几种解决方案.
一个基于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;
}
}
Run Code Online (Sandbox Code Playgroud)
或者,如上所述,您可以使用具有公共接口的共享库,并动态加载正确的库.
当然,如果将Matrix基类实现为"普通"类,则可以逐步细化并仅实现实际找到的部分是有益的,并依赖基类来实现性能不高的功能.
编辑:你谈论内联,我认为你正在寻找错误的功能级别,如果是这样的话.你需要相当大的函数来完成相当多的数据.否则,您将花费所有精力将数据准备为正确的格式,然后执行一些计算指令,然后将数据放回内存中.
我还会考虑如何存储您的数据.你在存储X,Y,Z,W的数组,或者你在不同的数组中存储大量的X,大量的Y,大量的W和许多W [假设我们正在进行3D计算]?根据您的计算方式,您可能会发现采用一种或另一种方式可以获得最佳效益.
我做了很多SSE和3DNow!几年前的优化,而"技巧"往往更多地是关于如何存储数据,以便您可以轻松地一次性获取正确类型数据的"捆绑".如果您以错误的方式存储数据,您将浪费大量时间"调整数据"(将数据从一种存储方式移动到另一种方式).
一种方法是实现符合相同接口的三个库.使用动态库,您只需交换库文件,可执行文件将使用它找到的任何内容.例如,在Windows上,您可以编译三个DLL:
然后使可执行链接Impl.dll.现在只需将三个特定DLL中的一个放入与其.exe重命名的同一目录中,Impl.dll它将使用该版本.同样的原则基本上应该适用于类UNIX操作系统.
下一步是以编程方式加载库,这可能是最灵活的,但它是特定于操作系统的,需要更多的工作(比如打开库,获取函数指针等).
编辑:当然,您可以只执行该功能三次,并在运行时选择一个,具体取决于某些参数/配置文件设置等,如其他答案所示.
| 归档时间: |
|
| 查看次数: |
1726 次 |
| 最近记录: |