0

いくつかの SSE 操作を実行しようとしていますが、add_sse 関数の最後で、計算したばかりの値を読み戻そうとすると、seg fault が発生します。しかし、for ループで値を出力するだけであれば、結果は問題ありません。また、各配列の要素 0 を読み取るだけでも問題ありません。要素 1 以降を読み取ると、セグ フォールトが発生します。

問題を特定するのを手伝ってくれる人はいますか? 私たちはすべてを試しましたが、まだセグメント障害があることを理解していません. ありがとう

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;
4

2 に答える 2

3

問題は、ResultCounter構造体のサイズが12バイトであるため、配列の最初の要素c[0]は16バイトに整列されていますが、2番目の要素は整列されてc[1]いないことです。今のところ最も迅速で簡単な修正は、この構造体に4バイトのパディングを追加することです。たとえば、未使用のintを追加します。

typedef struct
{
    unsigned int L;
    unsigned int M;
    unsigned int H;
    unsigned int unused;
} ResultCounter;
于 2012-12-05T08:17:49.483 に答える
-2

_mm_load_si128 には、16 バイトのアラインされたデータが必要です。

于 2012-12-04T23:40:25.987 に答える