SSE _mm_store_ps分段故障问题

时间:2014-02-13 00:34:59

标签: c++ segmentation-fault sse intrinsics

我遇到了_mm_store_ps命令的问题。我使用它时遇到了分段错误(我知道这是问题所在,因为当我注释掉那条线时,分段错误消失了)。这很奇怪,因为我使用静态数组,我手动要求编译器对齐,并且使用_mm_storeu_ps不会使问题消失。以下是相关的代码部分:

//Directly access array instead of using Boost interface
boost::numeric::ublas::matrix<float>::iterator2 it = result.begin2();
float temp[4] __attribute__((aligned__(16))), temp2 = 0;

//Use SSE
__m128 m1, sse_right1, sse_left1, store_sse __attribute__((aligned (16))) = _mm_set_ps1(0);

unsigned k = 0;
//Iterate over the dimensions of the matrices
for (unsigned i = 0; i < ls1; i++)
{   
    for (unsigned j = 0; j < rs2; j++)
    {   
        while (k + 3 < ls2)
        {   
            sse_right1 = _mm_load_ps(arr + k + j * rs1); 
            sse_left1 = _mm_load_ps(left_arr + k + i * ls2);
            m1 = _mm_mul_ps(sse_right1, sse_left1);
            store_sse = _mm_add_ps(store_sse,m1);
            k += 4;
        }   

        //If ls2 isn't divisible by 4
        while (k < ls2)
        {   
            temp2 += left_arr[i * ls2 + k] * arr[k + j * rs1];
            k++;
        }   

        if (ls2 >= 4)
        {   
            _mm_store_ps(temp, store_sse);

            for (unsigned l = 0; l < 4; l++)
            {   
                temp2 += temp[l];
            }   
        }   

        *it = temp2;
        store_sse = _mm_set_ps1(0);
        temp2 = 0;
        k = 0;
        it++;
    }   

分段错误不是数组边界的问题,因为执行会将其降低到_mm_store_ps行。任何帮助将不胜感激,谢谢!

编辑:问题在于_mm_load_ps,当我使用_mm_loadu_ps它运行正常。我使用静态数组作为_mm_load_ps的参数,所以我不知道为什么我遇到问题。

1 个答案:

答案 0 :(得分:4)

SSE要求其内存访问使用16字节对齐的地址。如果您不是从阵列外部读取,这可能是您的问题。

尝试使用未对齐版本的_mm_storeu_ps_mm_loadu_ps。它们会慢一点,但它们会起作用。在您确认问题之后,请尝试首先对齐内存以获得最佳性能。