电源上的 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

在其他一些地方,我可以找到有关 vmxvsx 扩展的信息,但也不清楚对应于哪些功率迭代。 例如 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 扩展:编译器标志和处理器支持的主要内容,如果未能解决你的问题,请参考以下文章

使用 opencv 框架的目标 C 项目的最佳编译器标志

SIMD C++ 库

Web/优化系列WebAssembly(wasm) SIMD优化

向量体系结构----SIMD指令集扩展和GPU

如何将编译器标志从 Autoconf 传递给 Automake?

优化系列汇编优化技术:WebAssembly(wasm)平台SIMD优化