Во-первых, было бы уместно рассмотреть, как библиотека Eigen обрабатывает матричное умножение.
Тогда матрица (MXN) -векторных (nx1) умножение без Эйгена может быть записана следующим образом:
1 void mxv(int m, int n, double* a, double* b, double* c)
2 { //a=bxc
3 int i, j;
4
5 for (i=0; i<m; i++)
6 {
7 a[i] = 0.0;
8 for (j=0; j<n; j++)
9 a[i] += b[i*n+j]*c[j];
10 }
11 }
Как вы можете видеть, поскольку никаких два продукта не вычислить тот же элемент результирующего вектора а [] и поскольку порядок, в котором вычисляются значения для элементов a [i] при i = 0 ... m, не влияет на правильность ответа, эти вычисления могут выполняться независимо по значению индекса i.
Тогда петля, подобная предыдущей, полностью параллелизуема. Было бы относительно просто использовать OpenMP для целей параллельной реализации на таких циклах.