版本1:
uint32_t xor_array_ver_1(uint32_t *array, int size)
{
uint32x2_t acc = vmov_n_u32(0);
uint32_t acc1 = 0;
for (; size != 0; size -= 2) {
uint32x2_t vec;
vec = vld1_u32(array);
array += 2;
acc = veor_u32(acc, vec);
}
acc1 = vget_lane_u32(acc,0) ^ vget_lane_u32(acc,1);
return acc1;
}
版本2:
uint32_t xor_array_ver_2(uint32_t *array, int size)
{
uint32x4_t acc = vmovq_n_u32(0);
uint32_t acc1 = 0;
for (; size != 0; size -= 4) {
uint32x4_t vec;
vec = vld1q_u32(array);
array += 4;
acc = veorq_u32(acc, vec);
}
acc1 ^= vgetq_lane_u32(acc,0);
acc1 ^= vgetq_lane_u32(acc,1);
acc1 ^= vgetq_lane_u32(acc,2);
acc1 ^= vgetq_lane_u32(acc,3);
return acc1;
}
将上述两个版本与传统的异或实现进行比较:
for (i=0; i<arr_size; i++)
val ^= my_array[i];
我发现了2个问题:
- 版本1的性能与原来相同。
- 版本2比原来好30%左右。
- 如果我将
my_array
声明为uint32_t my_array[BIG_LENGTH];
,那我可不可以重写它以使其更好? - 有没有一种非NEON的方式可以改进常规异或代码的性能?展开循环并没有任何改进。