我有以下代码
if ( i < 0 ) {
i = i + 1
}
使用NEON矢量化指令我需要执行上述操作。如何将NEON寄存器值与0进行比较并执行上述计算?
答案 0 :(得分:3)
您不需要很多说明。单个vsra指令将执行(向量右移累积):
vsra.u32 q0, q0, #31 // i += ((unsigned int) i) >> 31;
请注意,它是u32
,而不是s32
。
NEON很容易学习,但很难掌握,因为您需要了解许多与黑客相关的技术,以便编写像这样的高效代码,这比传统的if-else方法快很多倍。
答案 1 :(得分:1)
您可以进行比较,然后减去结果,因为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
如果您想在装配级别执行此操作,则只需使用以下说明: