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); } }
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; }
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); } }