【发布时间】:2019-04-03 14:44:53
【问题描述】:
我正在开发一个大型软件包,其中包含许多编译为共享对象的软件包。出于性能原因,我想用向量指令编译 Eigen 3(仅头文件库),但是模板化的方法正在到处编译。如何确保将 Eigen 函数编译到特定的目标文件中?
该软件包含约 2000 个单独的软件包。为了让开发以合理的速度进行,编译程序的推荐方法是稀疏地检查一些包并编译它们,然后可以使用预编译的(由某些 CI 系统)共享库执行程序。
问题是我的部分职责是优化程序的 CPU 时间。为此,我想用-march 标志编译我正在处理的包(我们称之为A.so),以便Eigen 可以利用现代SIMD 处理器扩展。
不幸的是,因为 Eigen 是一个只有头文件的库,所以 Eigen 函数被编译成许多不同的共享对象。例如,A.so 中调用的 CPU 最密集的方法之一是在B.so 中编译的矩阵乘法内核。许多其他 Eigen 函数被编译成 C.so、D.so 等。由于这些对象是为较旧的、更广泛实现的指令集扩展编译的,因此它们不使用 AVX、AVX2 等编译。
当然,一种可能的解决方案是将包B、C、D 等包含在我自己的稀疏编译中,但这抵消了仅编译项目一部分的优势。此外,如果我真的想在包A 的代码中矢量化所有线性代数运算,它会让我包含越来越多的包。
我正在寻找的是一种将所有打包 A 使用的 Eigen 函数编译成 A.so 的方法,就好像 Eigen 函数是使用 static 关键字定义的一样。这可能吗?我可以利用编译器/链接器中的某种机制来实现这一点吗?
【问题讨论】:
标签: c++ linker shared-libraries eigen