-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 回答