【发布时间】:2021-02-14 13:28:31
【问题描述】:
我正在考虑将一个基于 SIMD 的通用抽象库移植到电源架构中。
但是,关于哪些扩展支持哪些功能以及如何编译到它们的信息令人困惑。目前只关注 64 位处理器,不超过 power-7。
一方面我看到了这个document。
指令有 3 种类型:无要求、需要 8 次方和需要 9 次方。
例如vec_cmpgt没有特殊要求。
但是,当我使用 powerpc64-linux-gnu-g++-10 时,我看到一个错误:
error: '__builtin_altivec_vcmpgtsd' requires the '-mpower8-vector' option
在其他一些地方,我可以找到有关 vmx 和 vsx 扩展的信息,但也不清楚对应于哪些功率迭代。
例如 here 它谈到了 power-7 上的 vsx。
UPD:我错过了 64 位整数比较仅在 power8 上可用,但其他人在此之前。
【问题讨论】:
-
您可能想看看 github 上的这两个项目:github.com/ermig1979/Simd 和 github.com/simd-everywhere/simde - 它们都是跨平台 SIMD 并支持 PowerPC/POWER。
-
您是在寻找 C 内在函数,还是直接使用汇编指令可以?如果您使用 C 内在函数,编译器之间的行为可能会有所不同:您在 XL C/C++ 编译器文档中的第一个参考点,但您的错误消息来自 g++。
-
您可能还对 intel 内部函数的 powerpc 兼容性 shim 感兴趣:参见例如talospace.com/2019/07/easier-power-vectorizing-for-fun-and.html - 简而言之,您可能只需使用
-DNO_WARN_X86_INTRINSICS并像 x86 一样对待 ppc 就可以做很多事情。 -
好吧,有时它会一对一映射,或者编译器会优化它以提高效率,有时它不会。如果您想从头开始构建最佳的高级操作,您将需要花费大量时间在每个目标编译器的向量内在函数的杂草上(例如,只关注 gcc,不包括 AIX XL C 文档),并且/ 或花一些时间在 ISA 和 powerpc 汇编器上。我会发布一些链接作为答案。
-
我在stackoverflow.com/a/46086151/463510 的回答中添加了一个链接,希望能解释这一切。