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/