2014-12-02 65 views
0

我写了一个我想分发给我的同事的浮点密集DLL。二进制与VS中的不同矢量化路径?

是否有可能在VS中构建包含不同向量化的二进制文件,例如,在运行时可以在SSE或AVX2之间选择相同的二进制文件,以便获得最佳性能?

我目前通过在运行时加载不同的DLL进行分支,但我不喜欢增加的复杂性,并且我确信cpu检测逻辑持久。我认为ICC可以做到这一点(并被AMD起诉选择最差的代码路径...),但我无法在VS中找到功能。它存在吗?

+0

在运行时加载DLL是它似乎通常处理的方式。 – 2014-12-02 09:52:03

回答

1

您可以模拟.cpp文件,每个矢量化设置一个。然后,将每种设置的编译设置设置为所需的适当矢量化(而不是全局项目设置)。

假设你有一个名为algs.cpp模拟文件avx2_algs.cpp将只包含一个实现文件:

#include "algs.cpp" 

,将与自己的设置进行编译。

您还需要定义区别于函数名的链接宏:

#define VECT(func) avx2_##func 
#include "algs.cpp" 

,然后algs.cpp会碰到这样的:

void VECT(add)(..... 

或分化命名空间

namespace avx2 { 
    #include "algs.cpp" 
} 

然后,你需要一些类型的动态调度,将调用适当的设置功能。