问题标签 [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.

0 投票
1 回答
88 浏览

c - 如何获得零的 VSX 值?

我们在几个地方置换了一个向量,我们需要区分的 0 值与vec_perm内置函数一起使用。我们无法找到一个vec_zero()或类似的,所以我们想知道我们应该如何处理事情。

该代码目前使用两种策略。第一个策略是向量加载:

第二种策略是使用我们打算使用的掩码进行异或:

我们还没有开始基准测试(还),所以我们不知道一个是否比另一个更好。第一个策略使用 VMX 负载,它可能很昂贵。第二种策略避免了负载,但引入了数据依赖性。

我们如何获得零的 VSX 值?

0 投票
1 回答
37 浏览

c - 如何使用内置程序在运行时检查 msr.le?

这个问题出现在Power8 内核加密补丁中。该补丁使用 Power8 内置插件提供 AES。在加载 VSX 寄存器时,我们需要在 little-endian 机器上运行时执行 128 位字节序反转,以确保 VSX 寄存器加载正确的值。

在编译时,我们可以检查像__BYTE_ORDER__. 但是,我相信我们应该在运行时检查机器状态寄存器。如果msr.le=1,那么我们执行字节序交换。另请参阅AltiVec 编程环境手册,第 3.1.4 节,p。3-5。

我们如何使用内置函数在运行时检查机器状态寄存器?

0 投票
2 回答
112 浏览

c - 如何将一个小常数加载到向量中?

请原谅我对以下问题的无知。我们支持 GCC 4.8(及更高版本)和 IBM XL C/C++ 12(及更高版本)。我们还在 AIX 和 Linux 上支持大端和小端。编译器和平台使代码相当混乱。

我们想将常量加载1到 VSX 寄存器中。这是我们能够编写的代码,但它似乎是错误的,因为它太复杂了。宏XLC_VERSION,GCC_VERSIONLITTLE_ENDIAN有它们惯用的含义,因此导致它们的附加预处理器宏已被省略。

不明显的是,XL C/C++ 支持所有数据排列并拥有丰富的 API 集。IBM 编译器很容易使用(当它不会产生难以理解的警告和错误时)。

回到 4.8 的 GCC 仅支持 64x2 排列,并且它只有 API 的一个子集。例如,GCC 缺少用于 8x16 排列的 IBM API,而 GCC 没有vec_reve(这会使字节序反转变得容易)。

我真正想做的是这样的事情,让它在任何地方都“正常工作”,但它无法编译:

有没有更简单的方法将一个小常数加载到向量寄存器中?

0 投票
1 回答
52 浏览

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 是否正确,还是我们应该做其他事情?

0 投票
1 回答
333 浏览

gdb - 如何将向量变量打印为其 128 位 vsx 值?

在使用 Power8 的 PowerPC 上运行时,我试图找出字节序问题。大端没问题,小端有点麻烦。

下面uint8x16_p8是一个typedeffor __vector unsigned char。在大端机器上,我看到:

在一个小端机器上,我看到:

当 gdb 打印它使用内存布局的值时:

我想查看加载到 vsx 寄存器中的 128 位整数值。vsx 寄存器值是重要的,它总是大端。如果 vsx 值存在差异,那么我知道我需要在从内存加载期间置换一个向量。

此外,GDB 似乎不支持uint128_t

我如何让 GDB 打印 vsx 寄存器值(而不是内存布局值)?


GDB 的另一个问题是,它不能从“这里”反汇编表格,所以我找不到打印寄存器的位置。例如,disass .不“从这里反汇编”(它会导致语法错误),并且 using$pc不会在我所在的位置反汇编(它看起来像函数的开头):

0 投票
1 回答
2082 浏览

c - vec_sld 字节序敏感吗?

我正在使用核心加密的 PowerPC 机器。我在使用内置插件将 AES 密钥扩展从大端移植到小端时遇到问题。大端有效,但小端无效。

下面的算法是IBM 博客文章中介绍的片段。我认为我将问题隔离到下面的第 2 行:

进入函数后,big endian 和 little endian 都有以下参数:

但是,在执行第 2 行后,r6具有以下值:

小端机

大端机

注意小端机器上的奇数旋转。

当我在第 2 行执行后在小端机器上反汇编时:

我不知道为什么r6不是预期值。理想情况下,我会检查两台机器上的 vsx 寄存器。不幸的是,GDB 在两台机器上也存在问题,所以我不能做诸如反汇编和打印向量寄存器之类的事情。

vec_sld字节序敏感吗?还是有其他问题?

0 投票
1 回答
129 浏览

macros - IBM XL/C 是否在预处理器中表示 Altivec 支持?

我正在尝试确定何时激活一些 Altivec 代码路径。当我检查-qaltivec有效的预处理器宏时,我看不到相应的预处理器宏(见下文)。

我们的担心或恐惧是需要-qaltivec-DALTIVEC=1或类似的。用户几乎从不阅读手册,因此它会为平台生成无穷无尽的问题和错误报告。如果 RTFM 能够发挥作用,它会在过去 50 年左右发生。

XL/C-qaltivec在生效时是否会向 Altivec 发出信号?如果不是,是否有其他方法可以推断出来?

提前致谢。


以下来自GCC111,它是 Power7 机器。我不确定为什么编译器声称不支持 Altivec。

0 投票
1 回答
268 浏览

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?

0 投票
0 回答
78 浏览

c++ - 双字向量在没有 64 位数据类型的旧 Altivec 上旋转

这与Power4有关,缺少vector long long. 在 Power7 和 Power8 上,我们可以执行:

我需要为丢失的 64 位矢量类型找到解决方法并在 Power4 上轮换。我认为有两种策略。首先,在 C/C++ 中旋转或;其次,使用 32 位向量类型。我猜(2)是更快的策略,因为数据在向量寄存器中。

我觉得这个问题很久以前就解决了,因为双字轮换没有什么特别之处。不幸的是,搜索没有返回有用的点击:"power4" "doubleword" rotate

我想我的基本算法由三个 LOAD、两个 SHIFT、两个 PERM 和一个 OR 组成。但我不确定是否有更好的方法。

在没有双字循环的 Power4 上工作时,如何执行 64 位循环?


0 投票
0 回答
154 浏览

c++ - 为什么编译器不折叠 xxswapd 和 vperm?

我仍然试图让我的 1 到 2 cpb 脱离Power8 的 SHA 指令。此 C/C++ 代码将用户的消息复制到消息调度中:

当我编译-O3并查看反汇编时,我看到以下内容:

我相信正在发生的事情是:

  1. 负载发生在100008bc( lxvd2x)
  2. 预期转换发生在100008d0( xxswapd)
  3. 我的排列应用于100008d8( vperm)

在 (1) 处,VSX 寄存器有值,但它是 little-endian 格式。元素 0 和 4 需要交换;元素 2 和 3 需要交换。

在 (2) 和 (3) 处应用了两个排列。这有点像在shuffle_epi32x86shuffle_epi8机器上调用。

PowerPC 的vec_perm功能非常强大,任何两个排列都可以折叠成一个排列。

我的第一个问题是,为什么这两个排列没有被折叠成一个?

我的第二个问题是,如何强制编译器执行折叠?

我正在尽力避免内联汇编,因为代码支持 GCC、Clang 和 IBM 的 XL C/C++。IBM 的 XL C/C++ 不支持内联汇编以及 GCC 和 Clang,所以这将是一条痛苦的道路。


这是完整的反汇编: