我编写了一个浮点密集型DLL,我希望将其分发给我的同事。
是否可以在VS中构建包含不同向量化的二进制文件,例如在运行时SSE或AVX2之间选择相同的二进制文件,以便获得最佳性能?
我目前正在通过在运行时加载不同的DLL来进行分支,但我不喜欢增加的复杂性,并且我确信cpu检测逻辑是持久的。
我认为ICC可以做到这一点(并因AMD选择最差的代码路径而被起诉......)但是我找不到VS中的功能。它存在吗?
答案 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"
}
然后你需要某种类型的动态调度来调用适当的设置函数。