SSE加载邻居值

时间:2014-05-19 02:38:57

标签: c++ x86 sse simd

处理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?

1 个答案:

答案 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

请注意,当您使用大量不同的移位执行大量邻域操作时,有时会更有效地临时转置整个数据块,以便您只使用行索引而不必进行水平分割矢量运算如上所述。