电源上的 SIMD 扩展:编译器标志和处理器支持
Posted
技术标签:
【中文标题】电源上的 SIMD 扩展:编译器标志和处理器支持【英文标题】:SIMD extensions on power: compiler flags and processor support 【发布时间】: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 汇编器上。我会发布一些链接作为答案。
我在***.com/a/46086151/463510 的回答中添加了一个链接,希望能解释这一切。
【参考方案1】:
有一些资源可以帮助您完成任务。
首先,CPU 中可供您使用的实际底层向量指令因 CPU 版本而异。这些都记录在 ISA 中。对于:
Power7,这是Power ISA v2.06 (pdf) Power8,这是Power ISA v2.07 Power9,这是Power ISA v3.0这些都是海量的 PDF,告诉你很多事情,包括矢量指令的细节。如果您在汇编程序中编写代码,则可以直接使用它们。
然后,您注意到支持的编译器内在函数可能因编译器而异:您从非常适合 google 的 AIX XL C 编译器手册中找到参考,发现它不适用于 gcc。
所以你会想花一些美好的时间来:
vector extensions generally 上的 gcc 手册页 PowerPC vector builtins 上的页面 - 有助于将其分为Power 具有额外的复杂性,它支持具有许多不同名称的不同类型的向量扩展。有一个很好的解释器 VSX? VMX? Altivec? VR? VSR?! How these PowerPC SIMD acronyms relate to each other?
【讨论】:
以上是关于电源上的 SIMD 扩展:编译器标志和处理器支持的主要内容,如果未能解决你的问题,请参考以下文章
Web/优化系列WebAssembly(wasm) SIMD优化