如何定义二维数组和一维指针之间的引用,并修复 SSE2 不兼容问题?
How to define the reference between 2d-array and 1d pointer, and fix SSE2 incompatibility?
我正在尝试逐步使用 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 指针,先前的过程是错误的。我可能无法理解二维数组地址和取消引用。
这里是二维数组在我的代码中的定义方式。
unsigned char **img = malloc(16* sizeof(int *));
for (i=0;i<16;i++) {
img[i] = malloc(16* sizeof(int *));
}
我现在需要将二维数组的 1 行复制到另一个具有相同宽度的指针。
或者这个
unsigned char test[16] __attribute__ ((aligned (16)));
或这个
unsigned char *test = malloc(16 * sizeof(unsigned char *));
据我所知,接下来的三行给出了相同的地址,因为第一行和第二行打印了二维数组中第一行的地址,第三行打印了第一行中第一项的地址这是一样的。
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);
此代码至少存在 3 个问题:
- 错误在最后一行
C = ...
。 _mm_add_epi8
不接受 __m128i*
。请尝试*C = _mm_add_epi8(*X, *Y)
- 内在名称中只有一个
_
。
C
指针未初始化,您可能会遇到段冲突。初始化C
或不使用指针。
我正在尝试逐步使用 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 指针,先前的过程是错误的。我可能无法理解二维数组地址和取消引用。
这里是二维数组在我的代码中的定义方式。
unsigned char **img = malloc(16* sizeof(int *));
for (i=0;i<16;i++) {
img[i] = malloc(16* sizeof(int *));
}
我现在需要将二维数组的 1 行复制到另一个具有相同宽度的指针。 或者这个
unsigned char test[16] __attribute__ ((aligned (16)));
或这个
unsigned char *test = malloc(16 * sizeof(unsigned char *));
据我所知,接下来的三行给出了相同的地址,因为第一行和第二行打印了二维数组中第一行的地址,第三行打印了第一行中第一项的地址这是一样的。
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);
此代码至少存在 3 个问题:
- 错误在最后一行
C = ...
。_mm_add_epi8
不接受__m128i*
。请尝试*C = _mm_add_epi8(*X, *Y)
- 内在名称中只有一个
_
。 C
指针未初始化,您可能会遇到段冲突。初始化C
或不使用指针。