This example simply performs a matrix multiplication, solely for the purpose of demonstrating a basic usage of ggml and backend handling. The code is commented to help understand what each part does.
+Traditional matrix multiplication goes like this (multiply row-by-column):
+
+$$
+A \times B = C
+$$
+
$$
\begin{bmatrix}
2 & 8 \\
\end{bmatrix}
\=
\begin{bmatrix}
-60 & 110 & 54 & 29 \\
-55 & 90 & 126 & 28 \\
-50 & 54 & 42 & 64 \\
+60 & 90 & 42 \\
+55 & 54 & 29 \\
+50 & 54 & 28 \\
+110 & 126 & 64 \\
+\end{bmatrix}
+$$
+
+In `ggml`, we pass the matrix $B$ in transposed form and multiply row-by-row. The result $C$ is also transposed:
+
+$$
+ggml\\_mul\\_mat(A, B^T) = C^T
+$$
+
+$$
+ggml\\_mul\\_mat(
+\begin{bmatrix}
+2 & 8 \\
+5 & 1 \\
+4 & 2 \\
+8 & 6 \\
+\end{bmatrix}
+,
+\begin{bmatrix}
+10 & 5 \\
+9 & 9 \\
+5 & 4 \\
+\end{bmatrix}
+)
+\=
+\begin{bmatrix}
+60 & 55 & 50 & 110 \\
+90 & 54 & 54 & 126 \\
+42 & 29 & 28 & 64 \\
\end{bmatrix}
$$
memcpy(out_data.data(), result->data, ggml_nbytes(result));
// expected result:
- // [ 60.00 110.00 54.00 29.00
- // 55.00 90.00 126.00 28.00
- // 50.00 54.00 42.00 64.00 ]
+ // [ 60.00 55.00 50.00 110.00
+ // 90.00 54.00 54.00 126.00
+ // 42.00 29.00 28.00 64.00 ]
printf("mul mat (%d x %d) (transposed result):\n[", (int) result->ne[0], (int) result->ne[1]);
for (int j = 0; j < result->ne[1] /* rows */; j++) {
}
for (int i = 0; i < result->ne[0] /* cols */; i++) {
- printf(" %.2f", out_data[i * result->ne[1] + j]);
+ printf(" %.2f", out_data[j * result->ne[0] + i]);
}
}
printf(" ]\n");