C SSE中的Seg故障,不确定原因

C SSE中的Seg故障,不确定原因,c,sse,simd,C,Sse,Simd,我们试图执行一些SSE操作,但是,在add_SSE函数的末尾,我们试图读回刚刚计算的值,这将给我们一个seg错误。但是,如果我们只在for循环中打印值,结果就可以了。 另外,只读取每个数组中的元素0也是可以的。读取元件1及以上将导致seg故障 有人能帮我们找出问题吗?我们尝试了所有的方法,但仍然不知道会出现seg故障。谢谢 void main() { ResultCounter *c_sse=(ResultCounter *)memalign(16,sizeof(ResultCounte

我们试图执行一些SSE操作,但是,在add_SSE函数的末尾,我们试图读回刚刚计算的值,这将给我们一个seg错误。但是,如果我们只在for循环中打印值,结果就可以了。 另外,只读取每个数组中的元素0也是可以的。读取元件1及以上将导致seg故障

有人能帮我们找出问题吗?我们尝试了所有的方法,但仍然不知道会出现seg故障。谢谢

void main()
{
    ResultCounter *c_sse=(ResultCounter *)memalign(16,sizeof(ResultCounter)*4);    

    resetCounter (c_sse);  //initial struct to all 0

    add_sse (1,2, 3,4, c_sse);
}

void add_sse (unsigned int first, unsigned int second, unsigned int third, unsigned int fourth, ResultCounter *c)
{
    __attribute__((align(16))) int m_intarray[4] = {first, second, third,fourth};

    __attribute__((align(16))) int m_Larray[4] = {c[0].L, c[1].L, c[2].L,c[3].L};
    __attribute__((align(16))) int m_Marray[4] = {c[0].M, c[1].M, c[2].M,c[3].M};
    __attribute__((align(16))) int m_Harray[4] = {c[0].H, c[1].H, c[2].H,c[3].H};

    __m128i N = _mm_load_si128(&m_intarray[0]);
    __m128i L = _mm_load_si128(&m_Larray[0]);
    __m128i M = _mm_load_si128(&m_Marray[0]);
    __m128i H = _mm_load_si128(&m_Harray[0]);

    __m128i Lcarry = _mm_and_si128 (L, N);

    L = _mm_xor_si128 (L, N);

    __m128i Mcarry = _mm_and_si128 (M, Lcarry); 

    M = _mm_xor_si128 (M, Lcarry);

    H = _mm_or_si128 (H,Mcarry);

    _mm_store_si128(&m_Larray[0], L);
    _mm_store_si128(&m_Marray[0], M);
    _mm_store_si128(&m_Harray[0], H);

    for(i = 0; i < 4; i++) {
        //printf ("L:%d,addr=%u,M:%u,addr=%u,H:%u,addr=%u\n",m_Larray[i],&m_Larray[i],m_Marray[i],&m_Marray[i],m_Harray[i],&m_Harray[i]);
        c[i].L=m_Larray[i];
        c[i].M=m_Marray[i];
        c[i].H=m_Harray[i];
    }
}

//The struct used in main function.
typedef struct
{
    unsigned int L;
    unsigned int M;
    unsigned int H;
} ResultCounter;
void main()
{
结果计数器*c_sse=(结果计数器*)memalign(16,大小f(结果计数器)*4);
resetCounter(c_sse);//所有0的初始结构
增加上交所(1,2,3,4,上交所);
}
void add_sse(无符号整数第一,无符号整数第二,无符号整数第三,无符号整数第四,结果计数器*c)
{
__属性(align(16))intm_intarray[4]={first,second,third,fourth};
__m_Larray[4]={c[0].L,c[1].L,c[2].L,c[3].L}的属性(align(16));
__m_Marray[4]={c[0].m,c[1].m,c[2].m,c[3].m}的属性(align(16));
__m_Harray[4]={c[0].H,c[1].H,c[2].H,c[3].H}中的属性_uuu((align(16));
__m128i N=_mm_load_si128(&m_intarray[0]);
__m128i L=_mm_load_si128(&m_Larray[0]);
__m128i M=_mm_load_si128(&M_Marray[0]);
__m128i H=_mm_load_si128(&m_Harray[0]);
__m128i Lcarry=_mm_和_si128(L,N);
L=_-mm_-xor_-si128(L,N);
__m128i Mcarry=_mm_和_si128(M,Lcarry);
M=_mm_xor_si128(M,Lcarry);
H=_-mm_或_-si128(H,Mcarry);
_mm_store_si128(&m_Larray[0],L);
_mm_store_si128(&m_Marray[0],m);
_mm_store_si128(&m_Harray[0],H);
对于(i=0;i<4;i++){
//printf(“L:%d,addr=%u,M:%u,addr=%u,H:%u,addr=%u\n”,M_Larray[i]、&M_Larray[i]、M_Marray[i]、&M_Marray[i]、M_Harray[i]、&M_Harray[i]);
c[i].L=m_Larray[i];
c[i].M=M_Marray[i];
c[i].H=m_Harray[i];
}
}
//主函数中使用的结构。
类型定义结构
{
无符号整数L;
无符号整数M;
无符号整数H;
}结果计数器;

\u mm\u load\u si128需要16字节对齐的数据。

问题是
ResultCounter
结构的大小为12字节,因此尽管数组的第一个元素
c[0]
是16字节对齐的,但第二个元素
c[1]
不是。目前最快/最简单的修复方法是在此结构中添加4个字节的填充,例如,添加一个未使用的int:

typedef struct
{
    unsigned int L;
    unsigned int M;
    unsigned int H;
    unsigned int unused;
} ResultCounter;

我们使用_属性_((align(16)))来对齐所有整数数组。我现在的问题是,当我们读取16字节对齐数组时,会导致分段错误。i、 e.c[i].L=m_Larray[i];嗯,是的,然后呢?他不是广泛地使用了
\u属性(align(16))
吗?试试
valgrind--tool=memcheck./你的程序尝试过了,没有提供多少有用的信息……嗨,保罗,你能看看我的新更新吗?同样在SSE版本中,为什么使用for循环将结果读写回Resultcounter会再次出现seg错误?对于(i=0;更新确实需要是一个新问题,因为它与原始问题无关-请记住,因此问题和答案应该为未来读者以及原始海报提供有用的存档。请将新的性能相关问题放到新问题中。谢谢。好的,我发了另一篇帖子@Hope you can take看。我也把帖子恢复到原来的问题。谢谢你一路上提供的帮助