public static double[] Multiply_SIMD_2(Matrix A, Matrix B) { // Abour 50% fateser when matrix size >= 8x8 var vecSize = Vector <double> .Count; var bRemainer = B.Columns % Vector <double> .Count; if (B.Columns % Vector <double> .Count != 0) { B.AddColumns(bRemainer); } var C = new double[A.Rows * B.Columns]; for (int i = 0; i < A.Rows; i++) { for (int k = 0; k < A.Columns; k++) { for (int j = 0; j < B.Columns; j += vecSize) { var vC = new Vector <double>(C, i * A.Rows + j); var vB = new Vector <double>(B.internalArray, k * B.Columns + j); var vA = new Vector <double>(A.internalArray[i * A.Columns + k]); vC += vA * vB; vC.CopyTo(C, i * A.Rows + j); } } } return(C.ToArray()); }
public static double[] Multiply_SIMD_2(Matrix A, Matrix B) { // Abour 50% fateser when matrix size >= 8x8 var vecSize = Vector<double>.Count; var bRemainer = B.Columns % Vector<double>.Count; if (B.Columns % Vector<double>.Count != 0) { B.AddColumns(bRemainer); } var C = new double[A.Rows * B.Columns]; for (int i = 0; i < A.Rows; i++) { for (int k = 0; k < A.Columns; k++) { for (int j = 0; j < B.Columns; j += vecSize) { var vC = new Vector<double>(C, i * A.Rows + j); var vB = new Vector<double>(B.internalArray, k * B.Columns + j); var vA = new Vector<double>(A.internalArray[i * A.Columns + k]); vC += vA * vB; vC.CopyTo(C, i * A.Rows + j); } } } return C.ToArray(); }