我正在努力为 iPhone 4 编译 Eigen 库,该库具有带有 armv7 指令集的 ARM 处理器。到目前为止,当我指定预处理器定义 EIGEN_DONT_VECTORIZE 时,一切正常。但由于一些性能问题,我想使用armv7优化的代码。
无论我使用 LLVM-GCC 4.2 还是 LLVM CLang 2.0 哪个编译器,我总是会遇到编译错误。我发现(或者更好地这么认为),LLVM-GCC 4.2 是访问这些 ARM-NEON 特定指令的唯一方法。
当我不设置 EIGEN_DONT_VECTORIZE (并向 gcc 提供 -mfloat-abi=softfp -mfpu=neon)时,我收到以下 gcc 编译器错误:
src/m3CoreLib/Eigen/src/Core/arch/NEON/PacketMath.h:89:错误:在“__扩展__”之前预期有不合格的id
我已阅读有关使用“旧”gcc 4.2 的问题以及使用较新版本的 gcc 的建议。我不确定,但我相信由于应用程序商店的批准,这不是一个选择。我还能做些什么来为 iPhone 编译它吗?有谁解决了这个问题吗?
经过好几个小时摆弄不同的编译器设置后,我找到了一个令人满意的解决方案,并得出了以下结论。
关于 Eigen 的模板库方法,调试和发布设置之间存在令人惊讶的巨大差异:启用常用优化标志的发布设置使应用程序“运行速度比调试快 20 到 40 倍”。我以前从未在任何语言中见过这样的差异,根据我的经验,通常是 1.5 - 3。 虽然我仍然无法强制矢量化,即代码仅在定义了 EIGEN_DONT_VECTORIZE 的情况下进行编译,但最终的性能现在符合我的需求。