我正在使用 SIMD 加载指令从内存中加载元素,假设使用 Altivec,假设地址对齐:
float X[SIZE];
vector float V0;
unsigned FLOAT_VEC_SIZE = sizeof(vector float);
for (int load_index =0; load_index < SIZE; load_index+=FLOAT_VEC_SIZE)
{
V0 = vec_ld(load_index, X);
/* some computation involving V0*/
}
现在如果 SIZE 不是 FLOAT_VEC_SIZE 的倍数,那么 V0 可能在最后一次循环迭代中包含一些无效的内存元素。避免这种情况的一种方法是通过一次迭代减少循环,另一种方法是屏蔽潜在的无效元素,这里还有其他有用的技巧吗?考虑到上述内容是一组嵌套循环的最内层。因此,任何额外的非 SIMD 指令都会带来性能损失!