ВУЗ:
Составители:
Рубрика:
- 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 -
Страницы
- « первая
- ‹ предыдущая
- …
- 48
- 49
- 50
- 51
- 52
- …
- следующая ›
- последняя »