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

时间:2015-05-28 12:47:24

标签: c++ linker simd

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

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

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:-3)

语言完全支持此方案,不需要任何明确的处理。您的动态调度方案与它没有多大关系 - 项目在多个转换单元中实例化std :: vector是非常典型的,并且仍然不会违反ODR。通常,内联函数 - 特别是模板实例化 - 对于链接器是不可见的(即,在obj文件表中不显示为&#39;外部&#39;)

如果出于某种奇特的原因,您需要明确控制此链接类型,您必须使用特定于编译器的设备。 MSVC设备为selectany,gcc为some other devices。不知道铿锵 - 但重点是你很难想出使用其中任何一个的理由。