编译多个指令集时避免重复符号

S. *_*ark 6 c++ linker simd

我正在使用基于处理器功能的CPU调度来切换复杂数值算法的实现.我想包括两个版本(sse2和sse3版本的参数)我正在同一个动态库中编译.

迄今所采取的方法是包装所有架构特定的代码放到一个命名空间如namespace sse2namespace sse3,从而连接成最终的动态库时避免重复的符号名.

但是,如果我std::vector<int>在sse2和ss3版本中使用我的控件之外的某些代码(例如a )会发生什么.据我所知,std::vector实现将出现在sse2和sse3目标文件中,但理论上可能包含不同的指令,具体取决于编译器执行的优化.当我将这些目标文件链接到动态库时,将使用其中一个,我冒险尝试在仅支持sse2的cpu上运行sse3指令.

除了编译到两个独立的动态库之外,还可以做些什么来解决这个问题呢?我需要一个解决方案,在Windows,Mac OS和Linux上使用Visual Studio和clang.

Jas*_*n R 0

一种方法是在共享库级别而不是对象文件级别进行分派。这需要使用不同的指令集支持多次编译整个库,然后根据您检测到的 CPU 功能在运行时分派到适当的共享库。我在之前的回答中详细介绍了一种适用于 OS X 和 Linux 的方法。不过,我还没有尝试在 Windows 上实现这一点。