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

C 如何定义2d数组和1d指针之间的引用,并修复SSE2不兼容?,c,x86,sse,simd,C,X86,Sse,Simd,我正在尝试使用SIMD指令。我写了非常简单的代码行,但它总是说 char test[16]; __m128i *X,*Y,*C; X =(__m128i*) test; Y =(__m128i*) test; C = __mm_add_epi8(X,Y); 注意:应为“\uuum128i”,但参数的类型为“\uuuu vector(2)long int*” 编辑: 由于将2D数组指定给相同大小的1D指针,因此前面的过程是错误的。我可能无法理解2D数组地址和解引用 下面是如何在我的代码中定义2D

我正在尝试使用SIMD指令。我写了非常简单的代码行,但它总是说

char test[16];
__m128i *X,*Y,*C;
X =(__m128i*) test;
Y =(__m128i*) test;
C = __mm_add_epi8(X,Y);
注意:应为“\uuum128i”,但参数的类型为“\uuuu vector(2)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 *));
}
还是这个

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],地址似乎在72位之后开始,我不明白为什么。 我想把每一行的地址复制到另一个指针上,并将其用作我使用的单个数组

test = img[0]; 
test = img[1];
.
.
test = img[15]; 
它允许我使用test[i]访问每个字段;使用下一个代码,它可以很好地与test[0]配合使用

 X = _mm_load_si128((__m128i*)test);
但当I大于0时,我在test[I]中出现了分段错误。知道如果我使用下面的for循环逐项复制行,它就会工作。有什么建议吗

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

对于(i=0;i此代码至少有3个问题:

  • 错误在最后一行
    C=…
    \u mm\u add\u epi8
    不接受
    \u m128i*
    。请尝试
    *C=\u mm\u add\u epi8(*X,*Y)
  • 内在名称中只有一个
    \
  • C
    指针未初始化,您可能会遇到分段冲突。请初始化
    C
    或不使用指针

我在这个基上有分段错误=(无符号字符*)img[0];X=(uu m128i*)基;test=(无符号字符*)img[1];Y=(uu m128i*)test;*X=mm\u add\u epi8(X[0],Y[1]);@Feras:you想要
ptr=img
,而不是
ptr=img[0]
。您需要的是第一个字节的地址,而不是值。@PeterCordes img是2D数组。所以我想通过分配img[0]来获得第一行地址;
for(i=0; i<16; i++)
{ 
    test[i] = img[1][i];
} 
X = _mm_load_si128((__m128i*)test);