如何定义2d-array和1d指针之间的引用,并修复SSE2不兼容性?

时间:2015-10-07 21:53:59

标签: c x86 sse simd

我试图介入使用SIMD说明。我编写了非常简单的代码行,但总是说

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

注意:预期' __ m128i'但是参数的类型为' __ vector(2)long long int *'

编辑: 由于将2D数组分配给相同大小的1D指针,之前的过程是错误的。我可能在理解2D阵列地址和解除引用时遇到问题。

这是我的代码中如何定义2D数组。

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

我现在需要将1行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]; 

它允许我使用test [i]访问每个字段;使用下一个代码,它可以在test [0]下正常工作。

 X = _mm_load_si128((__m128i*)test);

但是当我大于0时,我得到了test [i]的分段错误。知道如果我使用for循环下的项目逐项复制它就可以了。有什么建议吗?

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

1 个答案:

答案 0 :(得分:3)

此代码至少有3个问题:

  • 错误位于最后一行C = ..._mm_add_epi8不接受__m128i*。请尝试*C = _mm_add_epi8(*X, *Y)
  • 内在名称中只有一个_
  • C指针未初始化,您可能会收到Segmentation Violation。初始化C或不使用指针。