2014-05-19 36 views
1

處理2D數組時常見的事情是加載一組值,然後將它們左移或右移,然後再將1個值加載到不再需要的值中。做這個的最好方式是什麼??SSE加載相鄰值

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

如果你談論的是二維數據做鄰居操作,那麼得到這些權一定量既可以使用未對齊加載或者如果你可以假設SSSE3或更高版本,使用_mm_alignr_epi8左移或載體。通常情況下,只有在SSE3或更低版本的舊CPU上使用未對齊的加載方法,而沒有其他選項。用於在載體操作

實例左移/右移1個浮子元件:

未對齊的加載:

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

va = _mm_setzero_ps(); 
vb = _mm_load_ps(&a[i][0]); 
for (int j = 0; j < 128; j += 4) 
{ 
    vc = _mm_load_ps(&a[i][j+4]); 
    vl = _mm_alignr_epi8(va, vb, sizeof(float));  // left shifted vector 
                 // middle vector = vb 
    vr = _mm_alignr_epi8(vb, vc, 3 * sizeof(float)); // right shifted vector 
    va = vb;           // shuffle source vectors left by one 
    vb = vc; 
} 

注意,當要執行大量的有大量不同班次的鄰近操作,有時候會更有效地轉換整個數據塊,以便您只需u行索引而不是像上面那樣做水平向量操作。