c - vgetq_lane_u64(x, 0) 与 vget_low_u64(x)

标签 c arm neon intrinsics

ARM 内联函数包括提取不同大小标量的函数。这些功能在ARM® C Language Extensions中有最完整的记录。 :

ET vgetQ_lane_ST(T vec, const int lane);

gets the value from the specified lane of an input vector. There are 24 intrinsics.

还有:

T vget_high_ST(T2 a);
T vget_low_ST(T2 a);

gets the high, or low, half of a 128-bit vector. There are 24 intrinsics.

我知道在某些情况下存在等价关系。例如,在小端机器上,以下内容适用于 64 位值:

uint64x2_t x = ...;
vgetq_lane_u64(x, 0) == vget_low_u64(x);

高车道也存在类似的等价物:

uint64x2_t x = ...;
vgetq_lane_u64(x, 1) == vget_high_u64(x);

我的问题是,由于这两个函数都返回标量,因此实际差异是什么?应该优先选择其中一个吗?

最佳答案

我认为重叠是一个实现细节。对于初学者来说,“...因为两个函数都返回标量”甚至不是真的: vgetq_lane_u64()返回 uint64_t ,这是一个标量; vget_low_u64()返回 uint64x1_t ,这是一个单位长度的 vector 。考虑一下这个人也存在:

uint64_t vget_lane_u64(uint64x1_t v, const int lane)

从语义上讲,使用vget_{high,low}只要您有 vector 运算的 Q 寄存器输出,并且需要将其拆分以将数据传递到 D 寄存器上的进一步 vector 运算中。使用vget{,q}_lane当您实际提取单个值以传递给标量代码时。我非常确定单位长度 vector 类型和标量类型之间的隐式转换实际上在任何地方都无法保证,所以我当然不会依赖它。

关于c - vgetq_lane_u64(x, 0) 与 vget_low_u64(x),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38670687/

相关文章:

c++ - 为什么我将垃圾值作为输出?

C不能只循环一次

c - 尝试通过指针返回 char 数组,但给出了不正确的结果

x86 - 将低级 x86 优化代码移植到 ARM Cortex-A8 架构

arm - 在 gcc 版本 5.0.1 上启用对 aarch64 (armv8-a) 的 fpu 支持

c++ - 如何使用 Neon Extension 有效地反转汇编语言 ARM 中的数组?

c - 前向声明 C

docker - 试图将容器移植到ARM

c - 如何阻止 GCC 破坏我的 NEON 内在函数?

android - 将 ARM NEON 代码移植到 AARCH64,很多问题