我使用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倍數的部分 - 我馬上更新我的答案。 –