# Overview

Many things can be realized on a computer very elegantly and efficiently today thanks to progress in software and programming languages. One thing that cannot be done efficiently on a computer **is computing**, at least not computing fast.

High performance computing (HPC) is to a large extend influenced by some highly tuned numeric libraries. Assume we want to multiply two matrices, i.e. calculate A = B * C. Then we can use some libraries that run at over 90 per cent peak performance. We only need to write something like this:

int m= num_rows(A), n= num_cols(B), k= num_cols(A), lda= A.get_ldim(), ldb= B.get_ldim(), ldc= C.get_ldim(); double alpha= 1.0, beta= 1.0;char a_trans= 'N', b_trans= 'N';_dgemm(&a_trans, &b_trans, &m, &n, &k, &alpha, &A[0][0], &lda, &B[0][0], &ldb, &beta, &C[0][0], &ldc); |

MTL4 allows you to write A = B * C and let you use BLAS internally if available. Otherwise, it provides you an implementation in C++ that is also reasonably fast (we usually reached 60 per cent peak).

Returning to the expression A = B * C; it can be used to express every product of sparse and dense matrices. The library will dispatch to the appropriate algorithm. Moreover, the expression could also represent a matrix vector product if A and C are column vectors (one would probably choose lower-case names though).

In fact, x = y * z can represent four different operations:

**matrix product;**

**matrix vector product;**

**scalar times matrix; or****scalar times vector.**

This video is a demonstration of our work on phase field crystal growth with MTL4 developed by our team.

To know more about MTL4, look into our Tutorial.