Последовательный алгоритм представляется тремя вложенными циклами и ориентирован
на последовательное вычисление строк результирующей матрицы
С
.
double *MatrixA=new double [n*n];
double *MatrixB=new double
[n*n];
double *MatrixC=new double [n*n];
MatrixInit(MatrixA,n);
MatrixInit(MatrixB,n);
for(i=0;i
{
for(k=0;k
{
sum=0;
for(j=0;j
{
sum+=MatrixA[i*n+j]*MatrixB[j*n+k];
}
MatrixC[i*n+k]=sum;
}
}
Вычисление всех элементов матрицы
С может быть выполнено независимо друг
от друга. Поэтому возможный подход для организации параллельных вычислений состоит
в использовании в качестве подзадачи определение одного элемента
матрицы С. Для проведения вычислений каждая
подзадача должна содержать по одной строке матрицы А и одному столбцу матрицы В
. Общее количество получаемых при таком подходе подзадач
оказывается равным n^2 (по числу элементов матрицы
С ). Обычно такое количество
сформированных подзадач превышает число имеющихся процессоров(ядер процессора) и делает неизбежным укрупнение
подзадач. Для дальнейшего рассмотрения определим в качестве подзадачи возьмем процедуру вычисления
всех элементов одной из строк матрицы С . Этот подход снижает количество подзадач до
величины n
. Для выполнения
вычислений подзадаче должны быть доступны одна из строк матрицы A
и все столбцы матрицы B.