c++ - 编译为多个指令集时避免重复符号

标签 c++ linker simd

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

目前采用的方法是将所有特定于体系结构的代码包装到一个命名空间中,例如namespace sse2namespace sse3从而在链接到最终动态库时避免重复的符号名称。

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

除了编译成两个独立的动态库之外,还有什么办法可以解决这个问题?我需要一个在 Windows、mac os x 和 linux 上同时使用 Visual Studio 和 clang 的解决方案。

最佳答案

一种方法是在共享库级别而不是目标文件级别进行调度。这将需要使用不同的指令集支持多次编译整个库,然后根据您检测到的 CPU 功能在运行时分派(dispatch)到适当的共享库。我详细介绍了一种适用于 OS X 和 Linux 的方法 in this previous answer .不过,我还没有尝试在 Windows 上实现这一点。

关于c++ - 编译为多个指令集时避免重复符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30507020/

相关文章:

c++ - 使用 std::cout 添加时间戳

linux - 如何包含 OpenCL 库以生成独立应用程序?

hash - 如果我散列一堆散列,散列冲突的可能性有多大?

c++ - OpenGL 纹理贴图

多维动态数组中的 C++ 对象构造

c++ - 如何在 C++ 中检查互联网可用性

c++ - 为什么我得到 "undefined reference to ` dladdr'"即使使用 -ldl 这个简单的程序?

c - 如何在这个高级 makefile 中链接两个 .c 文件?

c - 如何在 C 编程语言中使用 Intel Intrinsics 进行矢量化?

c++ - 使用 SIMD 进行 HOG 优化