Закон Амдала: умножение матриц

Я пытаюсь вычислить долю P моего кода, которая может быть распараллелена, чтобы применить закон Амдала и соблюсти теоретическое максимальное ускорение.

Мой код большую часть времени тратит на умножение матриц (с использованием библиотеки Eigen). Следует ли считать эту часть полностью распараллеливаемой?


person lodhb    schedule 30.06.2013    source источник


Ответы (2)


Если ваши матрицы достаточно велики, скажем, больше 60, вы можете скомпилировать с включенным OpenMP (например, -fopenmp с gcc), и продукты будут распараллелены для вас. Однако часто лучше распараллеливать на самом высоком уровне, особенно если матрицы не очень большие. Тогда это зависит от того, сможете ли вы выделить в своем алгоритме независимые задачи.

person ggael    schedule 30.06.2013

Во-первых, было бы уместно рассмотреть, как библиотека Eigen обрабатывает умножение матриц.

Тогда умножение матрицы (mxn) на вектор (nx1) без Eigen можно было бы записать так:

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 [] и поскольку порядок, в котором вычисляются значения для элементов a [i] для i = 0 ... m, не влияет на правильность ответа, эти вычисления могут быть выполнены независимо по значению индекса i.

Тогда цикл, подобный предыдущему, можно полностью распараллелить. Было бы относительно просто использовать OpenMP для параллельной реализации в таких циклах.

person L30nardo SV.    schedule 06.07.2013