コード例 #1
0
void Matrix<double>::add(const Matrix &m)
{
#ifdef _DEBUG
	if(!sameDim(m)) {
		//error
		throw std::invalid_argument("Matrix dimension must agree for addition");
	}
#endif

	double* y = pData;
	double* x = m.pData;
	int n = width*height;
    int i;
    for (i = 0;i < (n);i += 8) 
	{
        __m128d XMM0 = _mm_load_pd((x)+i  );
        __m128d XMM1 = _mm_load_pd((x)+i+2);
        __m128d XMM2 = _mm_load_pd((x)+i+4);
        __m128d XMM3 = _mm_load_pd((x)+i+6);
        __m128d XMM4 = _mm_load_pd((y)+i  );
        __m128d XMM5 = _mm_load_pd((y)+i+2);
        __m128d XMM6 = _mm_load_pd((y)+i+4);
        __m128d XMM7 = _mm_load_pd((y)+i+6);
        XMM4 = _mm_add_pd(XMM4, XMM0);
        XMM5 = _mm_add_pd(XMM5, XMM1);
        XMM6 = _mm_add_pd(XMM6, XMM2);
        XMM7 = _mm_add_pd(XMM7, XMM3);
        _mm_store_pd((y)+i  , XMM4);
        _mm_store_pd((y)+i+2, XMM5);
        _mm_store_pd((y)+i+4, XMM6);
        _mm_store_pd((y)+i+6, XMM7);
	}
}
コード例 #2
0
Matrix<elType>& Matrix<elType>::operator-=(const Matrix &m)
{
#ifdef _DEBUG
	if(!sameDim(m)) {
		throw std::invalid_argument("Matrix dimensions do not agree");
	}
#endif
	elType* ptrSource = m.pData;
	int sizeMatrix = height * width;
	for(elType* ptrData = pData; ptrData <pData+sizeMatrix;
		ptrData++, ptrSource++)
	{
		*(ptrData) -= *(ptrSource);
	}
	return *this;
}
コード例 #3
0
ファイル: matrix.cpp プロジェクト: the0s/DriverSim
void Matrix<elType>::add(const Matrix &m)
{
#ifdef _DEBUG
	if(!sameDim(m)) {
		//error
		throw std::invalid_argument("Matrix dimension must agree for addition");
	}
#endif

	elType* ptrSource = m.pData;
	int sizeMatrix = height * width;
	for(elType* ptrData = pData; ptrData < pData+sizeMatrix; ptrData++, ptrSource++) 
	{
		*(ptrData) += *(ptrSource);
	}
}