SSE,_mm_mul_ps访问冲突

时间:2015-12-30 05:23:36

标签: c++ sse

我正在使用SSE来实现矩阵乘法,以下代码是2个数组乘法。

以下是没有C++说明的SSE代码。

 void ComputeArrayCPlusPlus(
          float* pArray1,                   // [in] first source array
          float* pArray2,                   // [in] second source array
          float* pResult,                   // [out] result array
          int nSize)                        // [in] size of all arrays
{

    int i;

    float* pSource1 = pArray1;
    float* pSource2 = pArray2;
    float* pDest = pResult;

    for ( i = 0; i < nSize; i++ )
    {
        *pDest = (float)((*pSource1) * (*pSource1) + (*pSource2) * (*pSource2));

        pSource1++;
        pSource2++;
        pDest++;
    }
}

以下是包含SSE说明的测试代码。

void ComputeArrayCPlusPlusSSE(
          float* pArray1,                   // [in] first source array
          float* pArray2,                   // [in] second source array
          float* pResult,                   // [out] result array
          int nSize)                        // [in] size of all arrays
{

    int nLoop = nSize/ 4;

    __m128 m1, m2, m3, m4;

    __m128* pSrc1 = (__m128*) pArray1;
    __m128* pSrc2 = (__m128*) pArray2;
    __m128* pDest = (__m128*) pResult;


    for ( int i = 0; i < nLoop; i++ )
    {
        m1 = _mm_mul_ps(*pSrc1, *pSrc1);        // m1 = *pSrc1 * *pSrc1
        m2 = _mm_mul_ps(*pSrc2, *pSrc2);        // m2 = *pSrc2 * *pSrc2
        m3 = _mm_add_ps(m1, m2);                // m3 = m1 + m2
        *pDest = _mm_sqrt_ps(m3);                   // m4 = sqrt(m3)

        pSrc1++;
        pSrc2++;
        pDest++;
    }
    for (int i = 0; i < 4; i ++)
    {
        cout << pResult[i] << endl;
    }
}

以下是我的主要功能:

int main(int argc,char* argv[])
{
    float left[4] = {1, 1, 1, 1};
    float right[4] = {1, 1, 1, 1};
    float result[4] = {1, 1, 1, 1};
    ComputeArrayCPlusPlusSSE(left, right, result, 4);
    system("pause");
    return 0;

}

运行时,Visual Studio 2012 access conflict error报告中的ComputeArrayCPlusPlusSSE(args)报告m1 = _mm_mul_ps(*pSrc1, *pSrc1); // m1 = *pSrc1 * *pSrc1 m2 = _mm_mul_ps(*pSrc2, *pSrc2); // m2 = *pSrc2 * *pSrc2

__m128

我不知道原因,我的代码没有语法错误,数组已初始化,then数据也已初始化。希望有人可以帮助我,提前谢谢。

0 个答案:

没有答案