运行以下简短 C 代码的编译时出现段错误:
#include <pmmintrin.h>
#include <stdio.h>
#include <stdlib.h>
#define VALUE 4242
typedef short int Type;
void threshold(Type *dst, const Type *src, int len)
{
short int i, N=16;
short int checkval[] = { VALUE,VALUE,VALUE,VALUE,VALUE,VALUE,VALUE,VALUE,VALUE,VALUE,VALUE,VALUE,VALUE,VALUE,VALUE,VALUE };
const short int* __attribute__ ((aligned (16))) line1;
__m128i v1, v2, v3:
v2 = _mm_loadu_si128((__m128i*) checkval );
for(i = 0; i < len; i+=N)
{
line1 = src + N*i;
//Thisline
v1 = _mm_loadu_si128((__m128i*) line1 );
v3 = _mm_cmpgt_epi16( v1, v2 );
_mm_storeu_si128((__m128i*) (dst + N*i), v3 );
}
return;
}
int main()
{
int N = 1024;
Type dst[N], src[N];
int i;
for(i = 0; i < N; i++)
src[i] = rand()%VALUE;
threshold(dst, src, N);
return 0;
}
我很确定“This line”之后的那一行给我带来了问题,但我无法判断问题是由 line1 不适合 __m128i 还是其他一些错误引起的。
作为一个子问题 - 我尝试对齐第 1 行中的元素,函数 _mm_load_si128 是否更合适(我都尝试过,但我无法避免错误)。
最佳答案
在阈值
中,
short int i, N=16;
应该是:
short int i, N=8;
这是因为每个 vector 有 8 个 short int
元素,而指针算法考虑了元素的大小(我猜你假设你需要使用 16 个字节作为 vector 的大小?)。
关于c - C 中 __m128 的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30355179/