我写了一个浮点密集型 DLL,我想分发给我的同事。
是否可以在 VS 中构建包含不同矢量化的二进制文件,例如在运行时在 SSE 或 AVX2 之间选择相同的二进制文件,以便获得最佳性能?
我目前通过在运行时加载不同的 DLL 来进行分支,但我不喜欢增加的复杂性,而且我确信 cpu 检测逻辑持久。
我认为 ICC 可以做到这一点(并因选择最糟糕的代码路径而被 AMD 起诉......)但我无法在 VS 中找到该功能。存在吗?
最佳答案
您可以拥有模拟 .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"
}
然后您需要某种类型的动态调度来调用适当的设置函数。
关于c++ - VS 中具有不同矢量化路径的二进制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27245948/