【发布时间】:2014-09-11 18:44:52
【问题描述】:
我有以下代码
if ( i < 0 ) {
i = i + 1
}
使用 NEON 矢量化指令我需要执行上述操作。如何将 NEON 寄存器值与 0 进行比较并执行上述计算?
【问题讨论】:
我有以下代码
if ( i < 0 ) {
i = i + 1
}
使用 NEON 矢量化指令我需要执行上述操作。如何将 NEON 寄存器值与 0 进行比较并执行上述计算?
【问题讨论】:
您可以只进行比较然后减去结果,因为true 比较结果相当于 -1:
const int32x4_t vk0 = { 0 };
uint32x4_t vcmp = vcltq_s32(va, vk0); // a < 0 ?
va = vsubq_s32(va, (int32x4_t)vcmp); // subtract -1 (i.e. add 1) for
// each element where a < 0
如果您想在汇编级别执行此操作,则只需使用以下说明:
【讨论】:
您不需要太多说明。一条 vsra 指令就可以了(向量右移累加):
vsra.u32 q0, q0, #31 // i += ((unsigned int) i) >> 31;
请注意,这是有意使用的u32,而不是s32。
NEON 易于学习,但很难掌握,因为您需要了解许多与 bit-hacking 相关的技术,才能编写比传统 if-else 方法快很多倍的高效代码。
【讨论】: