-1

次のコードを使用して、SSEを使用してすべてのint配列要素を定数係数で分割しています。

void sse_div(int *arr,int num_shift,int N) // devide all array elements by 2
{
         num_shift=1;
     int nb_iters = N / 4;    
     __declspec(align(32))int *a1=arr;

      __m128i* l = (__m128i*)a1;  
     for (int i = 0; i < nb_iters; ++i, ++l)
          _mm_store_si128( l, _mm_srai_epi32(*l,num_shift)); //Error line

}

しかし、次のエラーが発生します

ここに画像の説明を入力してください

私はこの問題を取り除くことができません。誰かがこの問題を解決するのを手伝ってくれませんか。どんな助けでもありがたいです。

前もって感謝します

4

1 に答える 1

2

入力配列が明らかにずれているため、次のように、位置合わせされていないロード/ストアを使用できます。

void sse_div(int *arr, int N)     // divide all array elements by 2
{
    for (int i = 0; i < nb_iters; i += 4)
    {
        __m128i v = _mm_loadu_si128(&arr[i]);
        v = _mm_srai_epi32(v, 1);
        _mm_storeu_si128(&arr[i], v);
    }
}

アラインされていないロード/ストアを使用するとパフォーマンスが大幅に低下する可能性があることに注意してください(実行しているCPUによって異なります)。したがって、可能であればarr、メモリを割り当てるときにアレイを16バイトアラインする必要があります。

于 2012-12-11T14:36:56.960 に答える