Введение в практику разработки параллельных программ в стандарте MPI. Баканов В.М - 50 стр.

UptoLike

Составители: 

- 50 -
5. Лабораторная работа 5. Умножение матриц
последовательная и параллельные версии
Общие сведения. Операции с матрицами большой (тысячи/сотни тысяч)
размерности являются основой многих численных методов (например, МКЭ
метода конечных элементов). Только одна (далеко не самая крупная) квад-
ратная матрица размером 3000
×
3000 double-чисел требует для размещения
72 Мбайт ОП (предполагаем, что матрица является плотнозаполненнойт.е.
число нулевых элементов мало; иначе потребуются специальные методы
хранения ненулевых элементов ). Ясно, что в этом случае программист обя-
зан распределить по процессорам кластера не только вычислительные проце-
дуры, но и данные (те же матрицы); использование для хранения матриц дис-
ковой памяти катастрофически замедляет процедуру.
Одна из простейших матричных операцийумножение. Известно, что в
случае [C]=[A]×[B] значение элементов результирующей матрицы вычисля-
ется как (стандартный способ):
=
=
=
NCAk
1
k
ba
c
kjikij
,
где i=1 ÷ NRA – строки матриц [A] и [C],
j=1 ÷ NCB – столбцы матриц [B] и [C],
k=1 ÷ NCA – столбцы матрицы [A] и строки матрицы [B].
Хотя известны более эффективные алгоритмы (напр., умножение матриц
по Винограду и рекурсивный алгоритм Штрассена умножения квадратных
матриц), в дальнейшем используется стандартный (требующий
NRA×NCB×NCA операций умножения и NRA
×
(NCB-1)
×
NCA сложений).
Тривиальная программа MM_SER.C умножения матриц стандартным спо-
собом (используется последовательный вариант вычислений одним процес-
сором) приведена ниже:
// source code of MM_SER.C program
#include <stdio.h>
#include <sys/timeb.h> // for ftime
double f_time(void); /* define real time by ftime function */
#include "f_time.c"
#define NRA 3000 /* number of rows in matrix A */
#define NCA 3000 /* number of columns in matrix A */
#define NCB 10 /* number of columns in matrix B */
int main(int argc, char *argv[])
{
int i, j, k; /* indexes */
   5. Лабораторная работа 5. Умножение матриц –
      последовательная и параллельные версии

  Общие сведения. Операции с матрицами большой (тысячи/сотни тысяч)
размерности являются основой многих численных методов (например, МКЭ
– метода конечных элементов). Только одна (далеко не самая крупная) квад-
ратная матрица размером 3000 × 3000 double-чисел требует для размещения
72 Мбайт ОП (предполагаем, что матрица является плотнозаполненной – т.е.
число нулевых элементов мало; иначе потребуются специальные методы
хранения ненулевых элементов ). Ясно, что в этом случае программист обя-
зан распределить по процессорам кластера не только вычислительные проце-
дуры, но и данные (те же матрицы); использование для хранения матриц дис-
ковой памяти катастрофически замедляет процедуру.
  Одна из простейших матричных операций – умножение. Известно, что в
случае [C]=[A] × [B] значение элементов результирующей матрицы вычисля-
ется как (стандартный способ):

           k = NCA
   cij =     ∑ a ik b kj ,
            k =1


  где i=1 ÷ NRA – строки матриц [A] и [C],
      j=1 ÷ NCB – столбцы матриц [B] и [C],
      k=1 ÷ NCA – столбцы матрицы [A] и строки матрицы [B].

  Хотя известны более эффективные алгоритмы (напр., умножение матриц
по Винограду и рекурсивный алгоритм Штрассена умножения квадратных
матриц), в дальнейшем используется           стандартный (требующий
NRA × NCB × NCA операций умножения и NRA × (NCB-1) × NCA сложений).
  Тривиальная программа MM_SER.C умножения матриц стандартным спо-
собом (используется последовательный вариант вычислений одним процес-
сором) приведена ниже:

// source code of MM_SER.C program
#include 

#include  // for ftime
double f_time(void); /* define real time by ftime function */
#include "f_time.c"

#define NRA 3000 /* number of rows in matrix A */
#define NCA 3000 /* number of columns in matrix A */
#define NCB 10   /* number of columns in matrix B */

int main(int argc, char *argv[])
{
int i, j, k; /* indexes */

                                              - 50 -