Помощничек
Главная | Обратная связь


Археология
Архитектура
Астрономия
Аудит
Биология
Ботаника
Бухгалтерский учёт
Войное дело
Генетика
География
Геология
Дизайн
Искусство
История
Кино
Кулинария
Культура
Литература
Математика
Медицина
Металлургия
Мифология
Музыка
Психология
Религия
Спорт
Строительство
Техника
Транспорт
Туризм
Усадьба
Физика
Фотография
Химия
Экология
Электричество
Электроника
Энергетика

Лабораторная работа №4



 

1) Реализовать последовательный алгоритм умножения матрицы на вектор, получить зависимость времени работы алгоритма от размера матрицы.

 

Листинг программы:

#include "C:/Program Files/Microsoft HPC Pack 2008 SDK/include/mpi.h"

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include <math.h>

#include <time.h>

#include <stdlib.h>

#pragma comment (lib,"C:/Program Files/Microsoft HPC Pack 2008 SDK/lib/i386/msmpi.lib")

#define AROW 100

#define ACOL 100

#define MAX_VALUE 10

 

int proc_map(int i, int size)

{

size = size - 1;

int r = (int) ceil( (double)AROW / (double)size);

int proc = i / r;

return proc + 1;

}

 

int main(int argc, char** argv)

{

int size, rank;

MPI_Status Stat;

double start, finish, dt1;

 

int** a = new int*[AROW];

for(int i = 0; i < AROW; ++i)

a[i] = new int[ACOL];

int* b = new int[ACOL];

int* c = new int[AROW];

 

MPI_Init(&argc, &argv);

MPI_Comm_size(MPI_COMM_WORLD, &size);

MPI_Comm_rank(MPI_COMM_WORLD, &rank);

 

if (rank == 0)

{

 

srand(time(NULL));

for (int i=0;i<AROW;i++)

{

for (int j=0;j<ACOL;j++)

{

if (i==0) b[j] = rand() % MAX_VALUE;

a[i][j] = rand() % MAX_VALUE;

}

}

printf("Matrix A :\n");

for (int i=0;i<AROW;i++)

{

for (int j=0;j<ACOL;j++)

{

printf("%3d ", a[i][j]);

}

printf("\n");

}

printf("\nMatrix B :\n");

for (int i=0;i<ACOL;i++)

{

printf("%3d ", b[i]);

}

printf("\n\n");

 

start = MPI_Wtime();

for (int j=1;j<size;j++)

{

MPI_Send(b, ACOL, MPI_INTEGER, j, 99, MPI_COMM_WORLD);

}

for (int i=0;i<AROW;i++)

{

int processor = proc_map(i, size);

MPI_Send(a[i], ACOL, MPI_INTEGER, processor, (100*(i+1)), MPI_COMM_WORLD);

}

for (int i=0;i<AROW;i++)

{

int source_process = proc_map(i, size);

MPI_Recv(&c[i], 1, MPI_INTEGER, source_process, i, MPI_COMM_WORLD, &Stat);

printf("P%d : c[%d]\t= %d\n", rank, i, c[i]);

}

 

finish = MPI_Wtime();

printf("Total Time = %12.10f secs\n",finish-start);

}

else

{

 

MPI_Recv(b, ACOL, MPI_INTEGER, 0, 99, MPI_COMM_WORLD, &Stat);

for (int i=0;i<AROW;i++)

{

int processor = proc_map(i, size);

if (rank == processor)

{

int buffer[ACOL];

MPI_Recv(buffer, ACOL, MPI_INTEGER, 0, (100*(i+1)), MPI_COMM_WORLD, &Stat);

int sum = 0;

for (int j=0;j<ACOL;j++)

{

sum = sum + (buffer[j] * b[j] );

}

MPI_Send(&sum, 1, MPI_INTEGER, 0, i, MPI_COMM_WORLD);

}

}

}

 

MPI_Finalize();

for (int i=0;i<AROW;i++)

delete[] a[i];

delete[] a;

delete[] b;

delete[] c;

return 0;

}

 

Результат выполнения:

 

Рисунок 4

 

 

2) Реализовать параллельный строчно-ориентированный алгоритм умножения матрицы на вектор, вычислить время реализации алгоритма на 2, 4, 8 процессорах для размера матрицы от 100х100 до 1000х1000.

250*250

Результат выполнения с использованием 2х процессов:

Рисунок 5

 

Результат выполнения с использованием 4х процессов:

Рисунок 6

Результат выполнения с использованием 8х процессов:

Рисунок 7

 

1500х1500

 

Результат выполнения с использованием 2х процессов:

Рисунок 8

 

Результат выполнения с использованием 4х процессов:

Рисунок 9

 

 

Результат выполнения с использованием 8х процессов:

Рисунок 10

 

3) Вычислить ускорение и эффективность параллельного алгоритма по сравнению с последовательным в зависимости от размера матрицы.

 

При последовательном

 

Рисунок 11

 

При параллельном

Рисунок 12

 

 




Поиск по сайту:

©2015-2020 studopedya.ru Все права принадлежат авторам размещенных материалов.