VS中具有不同矢量化路径的二进制文件?

时间:2014-12-02 09:30:30

标签: c++ visual-studio visual-studio-2013

我编写了一个浮点密集型DLL,我希望将其分发给我的同事。

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

我目前正在通过在运行时加载不同的DLL来进行分支,但我不喜欢增加的复杂性,并且我确信cpu检测逻辑是持久的。

我认为ICC可以做到这一点(并因AMD选择最差的代码路径而被起诉......)但是我找不到VS中的功能。它存在吗?

1 个答案:

答案 0 :(得分: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"
}

然后你需要某种类型的动态调度来调用适当的设置函数。