问题标签 [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 投票
3 回答
131 浏览

c++ - Altivec——常量变量的加载

使用 altivec 从 const 指针加载的最佳方法是什么?

根据文档(和我的结果) vec_ld 不将 const 指针作为参数: http ://www-01.ibm.com/support/knowledgecenter/SS2LWA_12.1.0/com.ibm.xlcpp121.bg.doc /compiler_ref/vec_ld.html

因此,这样的事情会失败:

一个讨厌的解决方法是:

有一个更好的方法吗?谢谢你。

0 投票
2 回答
307 浏览

simd - 在 Powerpc 上,是否有任何等效于英特尔的 movemask 内在函数?

我想将 __vector bool long long 中的所有元素合并为一个 int,其中每个位都设置为输入向量的最高有效位

例子:

其中 x 等于 1 如果 vcmd[0] = 0XFFFFF... 或 0 如果 vcmp[0] = 0; y 也一样。

在 intel 上,我们可以通过使用 _mm_movemask 指令(intrinsic for intel)来实现这一点

有没有办法在 PowerPC 上做同样的事情?

感谢您的任何帮助

0 投票
3 回答
602 浏览

assembly - Equivalent for SSE in Power PC

What is the equivalent for SSE instruction set on Power PC? Is it Altivec? Does anyone have any samples for migrating SSE instructions to Power PC?

0 投票
1 回答
301 浏览

c++ - 如何使用 Altivec 将向量存储到内存中未对齐的位置

我从教程中知道,未对齐的加载和存储可能如下所示:

看起来很可怕。为了存储一个向量需要做大量的工作!并且有适当的性能损失。

第二个功能的工作速度比第一个慢 3-4 倍。由于我无法控制输入和输出内存的对齐,所以我必须实现这两个版本。如何最大程度地减少未对齐案例的性能损失?

0 投票
1 回答
257 浏览

c++ - Altivec:_mm_sad_epu8() 的类似物

我尝试移植一个 SSE 函数,该函数获得两个 8 位无符号整数数组的绝对差。看起来像:

主要工作由内部函数_mm_sad_epu8() 执行。

Altivec 有类似物吗?

0 投票
1 回答
140 浏览

c - 带有 Altivec 的 SIMD:为什么将两个向量相乘比相加两个向量更快?

我一直在使用 altivec 来实现基本的数学运算,作为为即将到来的项目学习 simd 的一种方式。此外,作为查看它的性能优势的一种方式,我跟踪执行操作需要多长时间,但我遇到了一些奇怪的事情。

我做的第一件事是将两个向量相加并减去两个向量。这工作正常。我做的下一件事是将两个向量相乘。然而,乘法比加法更快,即使根据我的特定 CPU 数据表中关于所使用指令的内容,使用更少的时钟周期来添加乘法。

我有两个每个 10MB 大的数组,并通过这两个例程运行它们:

在我的特定平台上,处理 av_AddValues 需要 81 毫秒,处理 av_MultiplyValues 需要 48 毫秒。(使用 std::chrono::high_resolution_clock 记录的时间)

为什么乘法比加法花费更少的时间来处理?

考虑到 __vector 类型总是处理 16 字节的数据,我认为添加 32 位值与乘以 16 位值并没有什么不同。

我的第一个想法是,由于将数字加在一起是一项微不足道的任务,CPU 完成操作的速度比它从内存中获取数据的速度要快。而对于乘法,这种获取延迟被 CPU 忙于工作并且永远不必等待这么久的事实所掩盖。

这是一个正确的假设吗?

完整代码:

perf stat 和 perf 记录的输出:

0 投票
1 回答
147 浏览

c - 是否可以在 Altivec 中旋转 128 位值?

我正在尝试将一些 ARM NEON 代码移植到 AltiVec。我们的 NEON 代码有两个 LOAD,一个 ROT,一个 XOR 和一个 STORE,所以它看起来像一个简单的测试用例。根据 IBM 的vec_rl文档:

结果的每个元素是通过将 a 的相应元素向左旋转 b 的相应元素指定的位数获得的。

文档继续说vector unsigned int是最大的数据类型,除非-qarch=power8,在这种情况下vector unsigned long long适用。

我想对单个元素执行 128 位旋转,而不是 32 位或 64 位旋转。位位置是 19、31、67、97 和 109。它们不是字节对齐的。(常数来自ARIA 分组密码)。

4x32 和 2x64 是最大的 AltiVec 数据排列吗?是否可以在 Altivec 中旋转 128 位值?

如果打包旋转是唯一可用的操作,那么在 C 或 AltiVec 中进行位旋转是最佳实践吗?

0 投票
3 回答
223 浏览

c - xlC 和类型“vector unsigned int”和“int”之间的操作是不允许的

我正在尝试在 PPC64-LE 上编译源文件。我正在使用 xlC 编译器并且编译失败。GCC 接受该程序,所以我不确定问题的原因是什么。

这是命令行:

这是编译错误:

这是源文件的相关部分。源文件是另一个问题的简化案例,它可以在 GitHub 上找到

__builtin_crypto_vcipher是内置的 GCC,IBM 声明xlC 支持它

第 118 行与上面显示的所有其他行一样,但它不会触发警告或错误。

有什么问题,我该如何解决?

0 投票
1 回答
92 浏览

c - 13.1.4 之前的 LXVD2X 有内置的 XL C 吗?

我正在使用内置的 C/C++ 工作。我需要将lvd2x未对齐的数据加载到 VMX 寄存器中的指令。它看起来lvd2x在 Power7 和 Power8 处理器上可用。

GCC 提供了vec_vsx_ld内置的执行任务。根据IBM XL C/C++ for Linux, V13.1.5第 4 章,版本 13.1.4 中添加的增强功能:

新的内置功能

支持以下 GCC 矢量内置函数:

  • vec_vsx_ld
  • ...

代码是为 XL C 保护的,所以我不需要 GCC 的内置程序。问题是,我找不到 XL C 的内置功能lvd2x

GCC 编译场为 AIX 提供 XL C v13.1.3(5725-C72、5765-J07)。13.1.4 之前的 LXVD2X 有内置的 XL C 吗?如果有内置的,那么它是什么?如果没有,那么我们如何访问指令?

(我试图避免 ASM 和内联 ASM。我对编写它的处理器了解不够。我也有过相当不愉快的经历,我不想通过尝试使用 asm 来扩大痛苦)。

0 投票
1 回答
457 浏览

c - 参数类型对于此链接类型的函数无效

我正在使用 IBM 的 XL C 编译器在 AIX 上工作。我遇到了一个编译错误,我不确定如何继续:

相关源代码如下所示。完整的源代码可在fips197-p8.c. 源代码是 Power 8__cipher__vcipherlast. 它有一个主函数和几个 C 函数。Effectively 是 Power 8 AES 的最小完整工作示例。

编译器版本如下所示。我们不控制编译器,所以这就是我们所拥有的:

vec_xl在 little-endian 上很好。vec_xl因为 big-endian 给我们带来了麻烦。

有什么问题,我该如何解决?