我正在使用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
数据也已初始化。希望有人可以帮助我,提前谢谢。