2015-10-07 38 views
-2

我正在嘗試使用SIMD指令。我寫了很簡單的代碼行,但它總是說如何定義2d-array和1d指針之間的引用,並修復SSE2不兼容問題?

char test[16]; 
__m128i *X,*Y,*C; 
X =(__m128i*) test; 
Y =(__m128i*) test; 
C = __mm_add_epi8(X,Y); 

注:應爲「__m128i」,但參數的類型爲「__vector(2)長的長整型*」

編輯: 以前的程序是由於將2D陣列分配給相同大小的1D指針而導致錯誤。我可能會在理解二維數組地址和解引用時遇到問題。

這裏是如何在我的代碼中定義2D數組。

unsigned char **img = malloc(16* sizeof(int *)); 
for (i=0;i<16;i++) { 
     img[i] = malloc(16* sizeof(int *)); 
} 

我現在需要將2D數組的一行復制到另一個指針,以獲得相同的寬度。 可以在本

unsigned char test[16] __attribute__ ((aligned (16))); 

或該

unsigned char *test = malloc(16 * sizeof(unsigned char *)); 

正如我理解的下三行他們最給出相同的地址,如在第一和第二行中的2D陣列在打印第一行的地址第三行打印第一行中第一行的地址,它們是相同的。

printf("%d\n", img); 
printf("%d\n", img[0]); 
printf("%d\n", &img[0][0]); 

如果我使用16無符號字符,這意味着下一行16位地址之後必須開始但通過印刷(IMG + 1),IMG [1]或IMG [1] [0]看來該地址開始後72bit,這我不明白爲什麼。 以爲我想將每行的地址複製到另一個指針並將其用作我使用的單個數組。

test = img[0]; 
test = img[1]; 
. 
. 
test = img[15]; 

它可以讓我通過使用測試訪問每個字段[I];使用所述下一個到來碼能正常工作與測試[0]。

X = _mm_load_si128((__m128i*)test); 

,但我得到了與試驗段故障[I]當我比0大知道,如果我通過項目複製的行項目使用循環低於它的工作原理。任何建議爲什麼?

for(i=0; i<16; i++) 
{ 
    test[i] = img[1][i]; 
} 
X = _mm_load_si128((__m128i*)test); 

回答

3

至少有3個問題與此代碼:

  • 錯誤是在最後一行C = ..._mm_add_epi8不接受__m128i*。請嘗試*C = _mm_add_epi8(*X, *Y)
  • 固有名稱中只有一個_
  • C指針未初始化,您可能會收到分段違例。初始化C或不要使用指針。
+0

我對此有段錯誤\t \t base =(unsigned char *)img [0]; \t \t X =(__m128i *)base; \t test =(unsigned char *)img [1]; \t Y =(__m128i *)測試; \t * X = _mm_add_epi8(X [0],Y [1]); – Feras

+0

@Feras:你想'ptr = img',而不是'ptr = img [0]'。您需要第一個字節的地址,而不是數值。 –

+0

@PeterCordes img是二維數組。所以我想通過分配img [0]來獲得第一個行地址; – Feras