我使用SIMD加载指令从存储器加载元素,让说使用AltiVec技术,假设对齐地址:避免与SIMD指令无效的内存负载
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*/
}
现在,如果大小不是FLOAT_VEC_SIZE的倍数,可以V0在最后一次循环迭代中包含一些无效的内存元素。避免的方法之一是通过一个迭代,以减少环路,另一个是屏蔽掉的潜在无效元素,有没有其他有用的技巧吗?考虑到上面是一组嵌套循环中的最内层。因此,任何额外的非SIMD指令都会带来性能损失!
感谢您的留言,但我不认为对齐是这里的一个问题。我们说,有在X 7组的元素,所以vec_ld(0,X)将带来前四“漂浮”,而vec_ld(4,X)将返回3个有效元素,同时还有第四难保,不是吗? – fsheikh
对不起 - 我错过了有关SIZE不是FLOAT_VEC_SIZE倍数的部分 - 我马上更新我的答案。 –