Презентация Параллельные методы решения задач линейной алгебры онлайн
На нашем сайте вы можете скачать и просмотреть онлайн доклад-презентацию на тему Параллельные методы решения задач линейной алгебры абсолютно бесплатно. Урок-презентация на эту тему содержит всего 25 слайдов. Все материалы созданы в программе PowerPoint и имеют формат ppt или же pptx. Материалы и темы для презентаций взяты из открытых источников и загружены их авторами, за качество и достоверность информации в них администрация сайта не отвечает, все права принадлежат их создателям. Если вы нашли то, что искали, отблагодарите авторов - поделитесь ссылкой в социальных сетях, а наш сайт добавьте в закладки.
Презентации » Образование » Параллельные методы решения задач линейной алгебры
Оцените!
Оцените презентацию от 1 до 5 баллов!
- Тип файла:ppt / pptx (powerpoint)
- Всего слайдов:25 слайдов
- Для класса:1,2,3,4,5,6,7,8,9,10,11
- Размер файла:692.38 kB
- Просмотров:61
- Скачиваний:0
- Автор:неизвестен
Слайды и текст к этой презентации:
№2 слайд
![Принципы распараллеливания В](/documents_5/08e92a995ef23c5fbaa4b38b2c5698f2/img1.jpg)
Содержание слайда: Принципы распараллеливания
В методах матричных вычислений повторяются одинаковые действия для разных элементов матриц
Это параллелизм по данным
Распараллеливание = распределение частей матриц между вычислительными узлами МВС
Способ разбиения на части и распределения данных определяет параллельный алгоритм решения задачи
№3 слайд
![Способы разбиения матриц](/documents_5/08e92a995ef23c5fbaa4b38b2c5698f2/img2.jpg)
Содержание слайда: Способы разбиения матриц
Ленточное разбиение – каждому процессору выделяется подмножество строк или столбцов
Всего строк (столбцов) – М, процессоров - р
Предполагается, что М кратно р
Блочное разбиение – каждому процессору выделяется блок элементов (прямоугольный, связный).
Также возможны упрощающие предположения кратности
№4 слайд
![Постановка задачи Матрица А](/documents_5/08e92a995ef23c5fbaa4b38b2c5698f2/img3.jpg)
Содержание слайда: Постановка задачи
Матрица А размерности m x n умножается на вектор b (n элементов), результат – вектор с (m элементов).
Общее количество операций (для оценки Т1):
m операций умножения строк А на b, где каждая:
n операций умножения элементов и (n – 1) операция сложения произведений
Время выполнения последовательного алгоритма:
Т1 = m (2n – 1)
Порядок трудоемкости последовательного алгоритма:
О(mn)
№5 слайд
![Пример разбиения ленточное по](/documents_5/08e92a995ef23c5fbaa4b38b2c5698f2/img4.jpg)
Содержание слайда: Пример разбиения – ленточное по строкам
Дополнительная задача разбиения:
дублировать или разбивать векторы b и с?
Каждый процессор хранит строку матрицы А + отдельные элементы векторов – порядок числа сохраняемых значений:
О(max(m, n))
Каждый процессор хранит строку матрицы А + все элементы векторов – порядок числа сохраняемых значений:
О(max(m, n))
Дублирование не повышает порядок сложности по памяти
№8 слайд
![Анализ эффективности](/documents_5/08e92a995ef23c5fbaa4b38b2c5698f2/img7.jpg)
Содержание слайда: Анализ эффективности параллельных вычислений
Упрощенный подход:
m = n
Не учитывается коммуникационная трудоемкость
Время выполнения всех операций одинаково
Последовательный алгоритм:
Т1 = n (2n – 1)
Параллельный алгоритм:
Тp = n (2n – 1)/p
Ускорение:
Sp = Т1 / Тp = p
Эффективность:
Еp = Sp/p = 1
№9 слайд
![Анализ эффективности](/documents_5/08e92a995ef23c5fbaa4b38b2c5698f2/img8.jpg)
Содержание слайда: Анализ эффективности параллельных вычислений
Учет коммуникационной трудоемкости
модель Хокни - оценка времени передачи сообщения m байт
tпд = tн + m/R
tн - время латентности,
R - пропускная способность сети
Параллельный алгоритм (все узлы узнают результат):
Тp = tн (log2p) + top( n (2n – 1)/p) + ( n (n – 1)/p) m/R
Предположения:
Топология – полный граф
Последовательный обмен данными между узлами (на каждом шаге сообщения увеличиваются в 2 раза), число шагов = log2p
№10 слайд
![Программная реализация MPI](/documents_5/08e92a995ef23c5fbaa4b38b2c5698f2/img9.jpg)
Содержание слайда: Программная реализация (MPI) – порядок по логике вызовов!
int ProcNum = 0;//число процессов
int ProcRank = 0;// ранг процесса
void main(int argc, char* argv[])
{
double* pMatrix; // A
double* pVector; // b
double* pResult; // c
int Size; // n
double* pProcRows;
double* pProcResult;
int RowNum;
double t1, t2;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &ProcNum);
MPI_Comm_rank(MPI_COMM_WORLD, &ProcRank);
№11 слайд
![if ProcRank if ProcRank](/documents_5/08e92a995ef23c5fbaa4b38b2c5698f2/img10.jpg)
Содержание слайда: if (ProcRank == 0)
if (ProcRank == 0)
{
printf ("Parallel matrix-vector multiplication program\n");
}
ProcessInitialization(pMatrix, pVector, pResult, pProcRows, pProcResult, Size, RowNum); // функция для выделения памяти и инициализации
t1 = MPI_Wtime();
// распределение данных по процессам
DataDistribution(pMatrix, pProcRows, pVector, Size, RowNum);
ParallelResultCalculation(pProcRows, pVector, pProcResult, Size, RowNum);//Axb
ResultReplication(pProcResult, pResult, Size, RowNum);//результат – всем
t2 = MPI_Wtime();
TestDistribution(pMatrix, pVector, pProcRows, Size, RowNum, pResult, t1, t2);
ProcessTermination(pMatrix, pVector, pResult, pProcRows, pProcResult);
MPI_Finalize();
}
№12 слайд
![void ProcessInitialization](/documents_5/08e92a995ef23c5fbaa4b38b2c5698f2/img11.jpg)
Содержание слайда: void ProcessInitialization (double* &pMatrix, double* &pVector,
void ProcessInitialization (double* &pMatrix, double* &pVector,
double* &pResult, double* &pProcRows, double* &pProcResult,
int &Size, int &RowNum)
{
int RestRows;// число строк, которые нужно распределить
int i;
if (ProcRank == 0)
{
printf("\nEnter size of matrix A (> p): ");
scanf("%d", &Size);
// можно добавить проверку и цикл do-while
}
// рассылка значения Size всем процессам
MPI_Bcast(&Size, 1, MPI_INT, 0, MPI_COMM_WORLD);
№13 слайд
![осталось распределить между](/documents_5/08e92a995ef23c5fbaa4b38b2c5698f2/img12.jpg)
Содержание слайда: // осталось распределить между процессами Size строк матрицы А
// осталось распределить между процессами Size строк матрицы А
RestRows = Size;
for (i=0; i<ProcRank; i++)
{ RestRows = RestRows-RestRows/(ProcNum-i);}
// число строк на процесс
RowNum = RestRows/(ProcNum-ProcRank);
pVector = new double [Size];
pResult = new double [Size];
pProcRows = new double [RowNum*Size];//элементы строк А для процесса
pProcResult = new double [RowNum];
if (ProcRank == 0)
{
pMatrix = new double [Size*Size];
// случайное заполнение А и b
RandomDataInitialization(pMatrix, pVector, Size);
}}
№14 слайд
![void RandomDataInitialization](/documents_5/08e92a995ef23c5fbaa4b38b2c5698f2/img13.jpg)
Содержание слайда: void RandomDataInitialization(double* pMatrix, double* pVector, int Size)
void RandomDataInitialization(double* pMatrix, double* pVector, int Size)
{
int i, j;
srand(unsigned(clock()));// инициализация датчика случайных чисел
for (i=0; i<Size; i++)
{
pVector[i] = rand()/double(1000);
for (j=0; j<Size; j++)
pMatrix[i*Size+j] = rand()/double(1000);
}
}
№15 слайд
![void DataDistribution double](/documents_5/08e92a995ef23c5fbaa4b38b2c5698f2/img14.jpg)
Содержание слайда: void DataDistribution(double* pMatrix, double* pProcRows, double* pVector,
void DataDistribution(double* pMatrix, double* pProcRows, double* pVector,
int Size, int RowNum)
{
int *pSendNum;//число элементов, отправляемых процессу
int *pSendInd;//индекс первого отправляемого процессу элемента
int RestRows=Size;
// рассылка вектора b всем процессам
MPI_Bcast(pVector, Size, MPI_DOUBLE, 0, MPI_COMM_WORLD);
//подготовка к распределению строк матрицы А по процессам
pSendInd = new int [ProcNum];//номера по процессам
pSendNum = new int [ProcNum];// количества по процессам
RowNum = Size/ProcNum;// повторно определение числа строк
// определение отсылаемых строк для каждого процесса
pSendNum[0] = RowNum*Size;
pSendInd[0] = 0;
№16 слайд
![for int i i lt ProcNum i for](/documents_5/08e92a995ef23c5fbaa4b38b2c5698f2/img15.jpg)
Содержание слайда: for (int i=1; i<ProcNum; i++)
for (int i=1; i<ProcNum; i++)
{
RestRows = RestRows - RowNum;
RowNum = RestRows/(ProcNum-i);// нужно если нет кратности
pSendNum[i] = RowNum*Size; //число элементов
pSendInd[i] = pSendInd[i-1]+pSendNum[i-1];//номер через смещение
}
// функция для отправления процессам разного числа элементов
MPI_Scatterv(pMatrix , pSendNum, pSendInd, MPI_DOUBLE, pProcRows,
pSendNum[ProcRank], MPI_DOUBLE, 0, MPI_COMM_WORLD);
// освобождение памяти
delete [] pSendNum;
delete [] pSendInd;
}
№17 слайд
![Функция MPI Scatterv int MPI](/documents_5/08e92a995ef23c5fbaa4b38b2c5698f2/img16.jpg)
Содержание слайда: Функция MPI_Scatterv
int MPI_Scatterv(void* sendbuf, int *sendcounts, int *displs,
MPI_Datatype sendtype, void* recvbuf, int recvcount,
MPI_Datatype recvtype, int root, MPI_Comm comm)
sendbuf - адрес начала буфера посылки
(используется только в процессе-отправителе root);
sendcounts - целочисленный массив
(размер равен числу процессов в группе),
содержащий число элементов, посылаемых каждому процессу;
displs - целочисленный массив
(размер равен числу процессов в группе),
i-ое значение определяет смещение относительно
начала sendbuf для данных, посылаемых процессу i;
sendtype - тип посылаемых элементов;
recvbuf - адрес начала буфера приема;
recvcount - число получаемых элементов;
recvtype - тип получаемых элементов;
root - номер процесса-отправителя;
comm - коммуникатор.
№18 слайд
![будет выполняться каждым](/documents_5/08e92a995ef23c5fbaa4b38b2c5698f2/img17.jpg)
Содержание слайда: // будет выполняться каждым процессом
// будет выполняться каждым процессом
void ParallelResultCalculation(double* pProcRows, double* pVector, double* pProcResult, int Size, int RowNum)
{
int i, j;
for (i=0; i<RowNum; i++)
{
pProcResult[i] = 0;
for (j=0; j<Size; j++)
pProcResult[i] += pProcRows[i*Size+j]*pVector[j];
}
}
№19 слайд
![будет выполняться каждым](/documents_5/08e92a995ef23c5fbaa4b38b2c5698f2/img18.jpg)
Содержание слайда: // будет выполняться каждым процессом для сбора результата
// будет выполняться каждым процессом для сбора результата
void ResultReplication(double* pProcResult, double* pResult, int Size, int RowNum)
{
int i;
int *pReceiveNum; //число получаемых элементов
int *pReceiveInd; //индекс элемента в векторе-результате
int RestRows=Size;//число нераспределенных элементов
// временные массивы
pReceiveNum = new int [ProcNum];//количества по процессам
pReceiveInd = new int [ProcNum];// номера по процессам
// определение частей (блоков элементов) вектора-результата
pReceiveInd[0] = 0;
pReceiveNum[0] = Size/ProcNum;
№20 слайд
![for i i lt ProcNum i for i i](/documents_5/08e92a995ef23c5fbaa4b38b2c5698f2/img19.jpg)
Содержание слайда: for (i=1; i<ProcNum; i++)
for (i=1; i<ProcNum; i++)
{
RestRows = RestRows - pReceiveNum[i-1];
pReceiveNum[i] = RestRows/(ProcNum-i);
pReceiveInd[i] = pReceiveInd[i-1]+pReceiveNum[i-1];
}
// функция для сбора данных(для результата) на всех процессах группы
MPI_Allgatherv(pProcResult, pReceiveNum[ProcRank], MPI_DOUBLE, pResult, pReceiveNum, pReceiveInd, MPI_DOUBLE, MPI_COMM_WORLD);
// освобождение памяти
delete [] pReceiveNum;
delete [] pReceiveInd;
}
№21 слайд
![Функция MPI Allgatherv int](/documents_5/08e92a995ef23c5fbaa4b38b2c5698f2/img20.jpg)
Содержание слайда: Функция MPI_Allgatherv
int MPI_Allgatherv(void* sendbuf, int sendcount, MPI_Datatype sendtype, void* recvbuf, int recvcount,MPI_Datatype recvtype, MPI_Comm comm)
sendbuf - адрес начала буфера посылки;
sendcount - число посылаемых элементов;
sendtype - тип посылаемых элементов;
recvbuf - адрес начала буфера приема;
recvcount - число получаемых элементов (от каждого процесса);
recvtype - тип получаемых элементов;
comm - коммуникатор.
Получателями являются все процессы группы.
Данные, посланные процессом i из своего буфера sendbuf, помещаются в i-ю порцию буфера recvbuf каждого процесса.
После завершения операции содержимое буферов приема recvbuf у всех процессов одинаково.
№22 слайд
![проверка результатов проверка](/documents_5/08e92a995ef23c5fbaa4b38b2c5698f2/img21.jpg)
Содержание слайда: // проверка результатов
// проверка результатов
void TestDistribution(double* pMatrix, double* pVector, double* pProcRows,
int Size, int RowNum, double* pResult, double t1, double t2)
{
if (ProcRank == 0)
{
printf("\nInitial Matrix: \n");
PrintMatrix(pMatrix, Size, Size);//самостоятельно
printf("\nInitial Vector: \n");
PrintVector(pVector, Size);//самостоятельно
printf("\n\nResult Vector: \n");
PrintVector(pResult, Size);
PrintTime(t1,t2);//самостоятельно
}
MPI_Barrier(MPI_COMM_WORLD);// все ждут процесс 0
№23 слайд
![вывод результатов с других](/documents_5/08e92a995ef23c5fbaa4b38b2c5698f2/img22.jpg)
Содержание слайда: // вывод результатов с других процессов
// вывод результатов с других процессов
for (int i=1; i<ProcNum; i++)
{
if (ProcRank == i)
{
printf("\nProcRank = %d \n", ProcRank);
printf(" Matrix Stripe:\n");
PrintMatrix(pProcRows, RowNum, Size);//самостоятельно
printf(" Vector: \n");
PrintVector(pVector, Size);//самостоятельно
}
MPI_Barrier(MPI_COMM_WORLD);//ждем всех
}
}
№24 слайд
![освобождение памяти на всех](/documents_5/08e92a995ef23c5fbaa4b38b2c5698f2/img23.jpg)
Содержание слайда: // освобождение памяти на всех процессах
// освобождение памяти на всех процессах
void ProcessTermination (double* pMatrix, double* pVector, double* pResult, double* pProcRows, double* pProcResult)
{
if (ProcRank == 0)
delete [] pMatrix;// матрица А только на процессе 0
//на всех процессах
delete [] pVector;
delete [] pResult;
delete [] pProcRows;
delete [] pProcResult;
}
№25 слайд
![Замечания Разделение по](/documents_5/08e92a995ef23c5fbaa4b38b2c5698f2/img24.jpg)
Содержание слайда: Замечания
Разделение (по функциям) действий генерации исходных данных и их рассылки процессам не подходит для больших объемов данных.
Лучше сразу после генерации передавать процессам предназначенные им данные,
Всегда ли вычислительные узлы одинаковы по памяти и быстродействию???
Скачать все slide презентации Параллельные методы решения задач линейной алгебры одним архивом:
Похожие презентации
-
Алгебраические методы решения задач на экстремум
-
Системы линейных алгебраических уравнений. Обзор методов решения
-
СИМПЛЕКС-МЕТОД РЕШЕНИЯ ЗАДАЧ ЛИНЕЙНОГО ПРОГРАММИРОВАНИЯ
-
МЕТОДЫ РЕШЕНИЯ ЗАДАЧ ЛИНЕЙНОГО ПРОГРАММИРОВАНИЯ
-
Методика ТРИЗ (теория решения изобретательских задач) в работе с детьми младшего дошкольного возраста Воспитатель: Пырина Анна И
-
Экономические методы социальной работы К основным экономическим методам решения этой комплексной социальной задачи можно от
-
Методика обучения решению линейных неравенств с одной переменной
-
Методы решения систем линейных уравнений 1- ой степени
-
Многогранники: виды задач и методы их решения (типовые задания С2) - 1
-
Векторы на плоскости и в пространстве, векторный метод решения задач