# Matrix multiplication.

**Write a program that multiplies two matrices with one another.**

The output of the program is a matrix \( C \), which is the result of the operation \( C = A \times B \), where \( A \in R^{n \times m} \), \( B \in R^{m \times p} \) and \( C \in R^{n \times p} \).

The input matrix dimensions are located at addresses `matrix_a_rows`

, `matrix_a_cols`

, `matrix_b_rows`

and `matrix_b_cols`

.

The data of matrix A is located at the address `matrix_a_start`

, and the data of matrix B is located at the address `matrix_b_start`

. The matrix data is stored in row-major order (i.e. the first row is stored first, then the second row, and so on).

Calculate the matrix \( C \) and store the result at the address `matrix_c_start`

. Store the dimensions of the matrix \( C \) at the addresses `matrix_c_rows`

and `matrix_c_cols`

.

If the dimensions of the input matrices are not compatible, set the output dimensions to \( -1 \).

##### Note

Matrix multiplication is defined as: \[ c_{ij} = \sum_{k=1}^{m} a_{ik} \cdot b_{kj} \] where \( c_{ij} \) is the element at the \( i \)-th row and \( j \)-th column of the matrix \( C \).

This can be graphically represented as:

$$ \begin{bmatrix} a_{11} & a_{12} & \cdots & a_{1n}\\ a_{21} & a_{22} & \cdots & a_{2n}\\ \vdots & \vdots & \ddots & \vdots\\ a_{m1} & a_{m2} & \cdots & a_{mn} \end{bmatrix} \times \begin{bmatrix} b_{11} & b_{12} & \cdots & b_{1p}\\ b_{21} & b_{22} & \cdots & b_{2p}\\ \vdots & \vdots & \ddots & \vdots\\ b_{n1} & b_{n2} & \cdots & b_{np} \end{bmatrix} = $$ $$ \begin{bmatrix} a_{11} \cdot b_{11} + \cdots + a_{1n} \cdot b_{n1} & \cdots & a_{11} \cdot b_{1p} + \cdots + a_{1n} \cdot b_{np}\\ a_{21} \cdot b_{11} + \cdots + a_{2n} \cdot b_{n1} & \cdots & a_{21} \cdot b_{1p} + \cdots + a_{2n} \cdot b_{np}\\ \vdots & \ddots & \vdots\\ a_{m1} \cdot b_{11} + \cdots + a_{mn} \cdot b_{n1} & \cdots & a_{m1} \cdot b_{1p} + \cdots + a_{mn} \cdot b_{np} \end{bmatrix} $$

This can be represented by the following code:

```
for (int i = 0; i < n; i++) {
for (int j = 0; j < p; j++) {
for (int k = 0; k < m; k++) {
C[i][j] += A[i][k] * B[k][j];
}
}
}
```

In python, you can test matrix multiplication with the following code:

```
import numpy as np
A = np.array([[1, 2, 3], [4, 5, 6]])
B = np.array([[1, 0], [0, 1], [1, 1]])
C = A @ B
```

**This task was not yet properly tested, it may not work as expected. If you find any issues, please report them.**

###### Input: Matrix multiplication

`Two matrices A and B at addresses matrix_a_start and matrix_b_start, with dimensions at addresses matrix_a_rows, matrix_a_cols, matrix_b_rows and matrix_b_cols.`

`Matrix C at address matrix_c_start, with dimensions at addresses matrix_c_rows and matrix_c_cols.`

Your program will be run with the following arguments:

```
--dump-cycles --cycle-limit 200000 --asm submission.S
```

Your program will be scored by this following metric:

```
Runtime of the program in cycles.
```

For interactive solution, you can use QtRvSim. The web version of the simulator is located here.