处理2D数组时常见的事情是加载一组值,然后将它们向左或向右移动,然后再将1个值加载到不再需要的值中。这样做的最佳方法是什么?
float arr[128][128];
for(int i = 1;i < 127;++i)
for(int j = 1;j < 127;++j)
{
__m128 top = _mm_load_ps(arr[i - 1][j]);
__m128 center = _mm_load_ps(arr[i][j]);
//...stuff
//rotate the top
top = _mm_shuffle_ps(top,top,_MM_SHUFFLE(0,3,2,1));
//how do i load another item in without insert?
答案 0 :(得分:1)
如果您正在谈论对2D数据执行邻域操作,那么要获得向左或向右移动一定量的向量,您可以使用未对齐的加载,或者如果您可以假设SSSE3或更高版本,请使用{{1} }。通常情况下,您只能在没有其他选项的SSE3或更低版本的旧CPU上使用未对齐的加载方法。
对向左/向右移动1个浮点元素的向量进行操作的示例:
未对齐的加载:
_mm_alignr_epi8
for (int j = 0; j < 128; j += 4)
{
vl = _mm_loadu_ps(&a[i][j-1]); // left shifted vector
vm = _mm_load_ps(&a[i][j]); // middle vector
vr = _mm_loadu_ps(&a[i][j+1]); // right shifted vector
}
:
_mm_alignr_epi8
请注意,当您使用大量不同的移位执行大量邻域操作时,有时会更有效地临时转置整个数据块,以便您只使用行索引而不必进行水平分割矢量运算如上所述。