问题标签 [altivec]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 如何获得零的 VSX 值?
我们在几个地方置换了一个向量,我们需要区分的 0 值与vec_perm
内置函数一起使用。我们无法找到一个vec_zero()
或类似的,所以我们想知道我们应该如何处理事情。
该代码目前使用两种策略。第一个策略是向量加载:
第二种策略是使用我们打算使用的掩码进行异或:
我们还没有开始基准测试(还),所以我们不知道一个是否比另一个更好。第一个策略使用 VMX 负载,它可能很昂贵。第二种策略避免了负载,但引入了数据依赖性。
我们如何获得零的 VSX 值?
c - 如何使用内置程序在运行时检查 msr.le?
这个问题出现在Power8 内核加密补丁中。该补丁使用 Power8 内置插件提供 AES。在加载 VSX 寄存器时,我们需要在 little-endian 机器上运行时执行 128 位字节序反转,以确保 VSX 寄存器加载正确的值。
在编译时,我们可以检查像__BYTE_ORDER__
. 但是,我相信我们应该在运行时检查机器状态寄存器。如果msr.le=1
,那么我们执行字节序交换。另请参阅AltiVec 编程环境手册,第 3.1.4 节,p。3-5。
我们如何使用内置函数在运行时检查机器状态寄存器?
c - 如何将一个小常数加载到向量中?
请原谅我对以下问题的无知。我们支持 GCC 4.8(及更高版本)和 IBM XL C/C++ 12(及更高版本)。我们还在 AIX 和 Linux 上支持大端和小端。编译器和平台使代码相当混乱。
我们想将常量加载1
到 VSX 寄存器中。这是我们能够编写的代码,但它似乎是错误的,因为它太复杂了。宏XLC_VERSION
,GCC_VERSION
和LITTLE_ENDIAN
有它们惯用的含义,因此导致它们的附加预处理器宏已被省略。
不明显的是,XL C/C++ 支持所有数据排列并拥有丰富的 API 集。IBM 编译器很容易使用(当它不会产生难以理解的警告和错误时)。
回到 4.8 的 GCC 仅支持 64x2 排列,并且它只有 API 的一个子集。例如,GCC 缺少用于 8x16 排列的 IBM API,而 GCC 没有vec_reve
(这会使字节序反转变得容易)。
我真正想做的是这样的事情,让它在任何地方都“正常工作”,但它无法编译:
有没有更简单的方法将一个小常数加载到向量寄存器中?
gcc - Power8 vsldoi 内置或替换
我正在尝试使用内置函数将一些 ASM 代码移植到 C/C++ 中。ASM 代码具有:
我找不到内置的 for vec_vsldoi
。当我搜索 IBM 的网站时,我得到0 hits。我认为 vec_sldw
很接近,但它需要 3 个参数而不是 4 个。
我的第一个问题是,有内置的 forvec_vsldoi
吗?如果没有,我们是用vec_sldw
还是别的?
除了 XL C/C++,我们还支持 GCC 4.8。GCC 似乎缺乏这两个内在函数。我想我有一个替代品,但我有保留。一个测试程序显示汇编器可以汇编vsldoi
。
我的第二个问题是,扩展的 GCC ASM 是否正确,还是我们应该做其他事情?
gdb - 如何将向量变量打印为其 128 位 vsx 值?
在使用 Power8 的 PowerPC 上运行时,我试图找出字节序问题。大端没问题,小端有点麻烦。
下面uint8x16_p8
是一个typedef
for __vector unsigned char
。在大端机器上,我看到:
在一个小端机器上,我看到:
当 gdb 打印它使用内存布局的值时:
我想查看加载到 vsx 寄存器中的 128 位整数值。vsx 寄存器值是重要的,它总是大端。如果 vsx 值存在差异,那么我知道我需要在从内存加载期间置换一个向量。
此外,GDB 似乎不支持uint128_t
:
我如何让 GDB 打印 vsx 寄存器值(而不是内存布局值)?
GDB 的另一个问题是,它不能从“这里”反汇编表格,所以我找不到打印寄存器的位置。例如,disass .
不“从这里反汇编”(它会导致语法错误),并且 using$pc
不会在我所在的位置反汇编(它看起来像函数的开头):
c - vec_sld 字节序敏感吗?
我正在使用核心加密的 PowerPC 机器。我在使用内置插件将 AES 密钥扩展从大端移植到小端时遇到问题。大端有效,但小端无效。
下面的算法是IBM 博客文章中介绍的片段。我认为我将问题隔离到下面的第 2 行:
进入函数后,big endian 和 little endian 都有以下参数:
但是,在执行第 2 行后,r6
具有以下值:
小端机:
大端机:
注意小端机器上的奇数旋转。
当我在第 2 行执行后在小端机器上反汇编时:
我不知道为什么r6
不是预期值。理想情况下,我会检查两台机器上的 vsx 寄存器。不幸的是,GDB 在两台机器上也存在问题,所以我不能做诸如反汇编和打印向量寄存器之类的事情。
vec_sld
字节序敏感吗?还是有其他问题?
macros - IBM XL/C 是否在预处理器中表示 Altivec 支持?
我正在尝试确定何时激活一些 Altivec 代码路径。当我检查-qaltivec
有效的预处理器宏时,我看不到相应的预处理器宏(见下文)。
我们的担心或恐惧是需要-qaltivec
和-DALTIVEC=1
或类似的。用户几乎从不阅读手册,因此它会为平台生成无穷无尽的问题和错误报告。如果 RTFM 能够发挥作用,它会在过去 50 年左右发生。
XL/C-qaltivec
在生效时是否会向 Altivec 发出信号?如果不是,是否有其他方法可以推断出来?
提前致谢。
以下来自GCC111,它是 Power7 机器。我不确定为什么编译器声称不支持 Altivec。
64-bit - 'vector long long' 的可用性是什么?
我正在一台旧的 PowerMac G5 上进行测试,它是一台 Power4 机器。构建失败:
失败是由于:
我无法确定何时应该使 typedef 可用。机器-mcpu=power4 -maltivec
报告 64 位可用性:
OpenPOWER | 6.1。Vector Data Types手册提供了有关矢量数据类型的良好信息,但没有讨论何时vector long long
可用。
什么是可用性__vector unsigned long long
?什么时候可以使用 typedef?
c++ - 双字向量在没有 64 位数据类型的旧 Altivec 上旋转
这与Power4有关,缺少vector long long
. 在 Power7 和 Power8 上,我们可以执行:
我需要为丢失的 64 位矢量类型找到解决方法并在 Power4 上轮换。我认为有两种策略。首先,在 C/C++ 中旋转或;其次,使用 32 位向量类型。我猜(2)是更快的策略,因为数据在向量寄存器中。
我觉得这个问题很久以前就解决了,因为双字轮换没有什么特别之处。不幸的是,搜索没有返回有用的点击:"power4" "doubleword" rotate。
我想我的基本算法由三个 LOAD、两个 SHIFT、两个 PERM 和一个 OR 组成。但我不确定是否有更好的方法。
在没有双字循环的 Power4 上工作时,如何执行 64 位循环?
c++ - 为什么编译器不折叠 xxswapd 和 vperm?
我仍然试图让我的 1 到 2 cpb 脱离Power8 的 SHA 指令。此 C/C++ 代码将用户的消息复制到消息调度中:
当我编译-O3
并查看反汇编时,我看到以下内容:
我相信正在发生的事情是:
- 负载发生在
100008bc
(lxvd2x
) - 预期转换发生在
100008d0
(xxswapd
) - 我的排列应用于
100008d8
(vperm
)
在 (1) 处,VSX 寄存器有值,但它是 little-endian 格式。元素 0 和 4 需要交换;元素 2 和 3 需要交换。
在 (2) 和 (3) 处应用了两个排列。这有点像在shuffle_epi32
x86shuffle_epi8
机器上调用。
PowerPC 的vec_perm
功能非常强大,任何两个排列都可以折叠成一个排列。
我的第一个问题是,为什么这两个排列没有被折叠成一个?
我的第二个问题是,如何强制编译器执行折叠?
我正在尽力避免内联汇编,因为代码支持 GCC、Clang 和 IBM 的 XL C/C++。IBM 的 XL C/C++ 不支持内联汇编以及 GCC 和 Clang,所以这将是一条痛苦的道路。
这是完整的反汇编: