Автор работы: Пользователь скрыл имя, 13 Декабря 2013 в 13:33, лабораторная работа
Цель работы: ознакомление с архитектурой, принципами кластерной вычислительной системы и практикой удаленного доступа к вычислительным ресурсам кластера.
} // end of MAIN function
// end of PI_02.C program
Результат программы:
Контрольные вопросы:
Даже весьма быстродействующая сеть обладает свойством латентности; латентность особо сильно снижает реальную производительность сети при частом обмене (небольшими по объему) сообщениями (при задержке поступления очередного порции информации вычислительному узлу он вынужденно простаивает). Тем самым, общая скорость обмена существенно снижается от скорости, заявленной изготовителем.
Латентность - ‘времени разгона’ до
номинальной
Цена обмена – размер блока данных, которые канал ‘точка-точка’ мог бы передать при нулевой латентности, МБ.
В случае одностороннего обмена сообщениями между двумя узлами (обмен типа ‘точка-точка’) затрачиваемое на передачу время Т (сек) оценивается как:
T=X/S+L,
где X – длина сообщения (Mбайт),
S – пропускная способность
L – время разгона операции обмена (не зависит от длины сообщения), сек.
Иногда бывает удобно оперировать латентностью, приведенной к скорости (цена обмена P, Мбайт):
P=LxS,
Как зависит реальная производительность сети от размера передаваемых сообщений? При сообщениях какой длины производительность сети достигает (теоретического) уровня?
При определении реальной (с учетом латентности) пропускной способности сети на операциях обмена типа ‘точка-точка’ используют пару простейших блокирующих (блокирующие функции возвращают управление вызывающему процессу только после того, как данные приняты или переданы или скопированы во временный буфер) MPI-предписаний MPI_Send/MPI_Recv, причем каждая операция повторяется много раз (с целью статистического усреднения).
Для виртуального кластера максимально достижимая реальная производительности коммуникационной сети достигается при размере сообщений более 128/256 kбайт, при этом величина латентности может достигать 300/400 мксек (что является платой за виртуальное совмещение сетей управления и коммуникаций единой физической Fast Ethernet-сетью).
При виртуализации сети общая физическая сеть разбивается на множество виртуальных подсетей. При этом по единой сети могут передаваться различные данные, предназначенные для каждой виртуальной сети. Для оптимального быстродействия, как правило, размеры передаваемых/принимаемых данных имеют небольшие размеры. При разбивании одного общего пакета на множество меньших подпакетов приводит к увеличению латентности, т.е. времени разгона сети.
Федеральное агентство по образованию
Московский государственный открытый университет
Чебоксарский политехнический институт
Кафедра
Информационных технологий и программирования
(шифр специальности)
Лабораторная работа №5
по дисциплине: параллельное программирование
Дата проверки Выполнили студенты
Сорокин Д.В.
Результат проверки Учебный шифр
609264
609244
Курс 4
Проверил Малов А.А.
Замечания
Чебоксары, 2012 г.
Лабораторная работа №5
Цель работы: уяснение принципов распределения данных по вычислительным узлам кластера, приобретение практических знаний и навыков в создании MPI-программ реализации стандартных алгоритмов.
Выполнение работы:
Листинг работы:
/ 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 */
double a[NRA][NCA], /* matrix A to be multiplied */
b[NCA][NCB], /* matrix B to be multiplied */
c[NRA][NCB], /* result matrix C */
t1,t2; // time’s momemts
/* Initialize A, B, and C matrices */
for (i=0; i<NRA; i++)
for (j=0; j<NCA; j++)
a[i][j] = i+j;
for (i=0; i<NCA; i++)
for (j=0; j<NCB; j++)
b[i][j] = i*j;
for(i=0; i<NRA; i++)
for(j=0; j<NCB; j++)
c[i][j] = 0.0;
t1=f_time(); // get start time’s moment
/* Perform matrix multiply */
for(i=0; i<NRA; i++)
for(j=0; j<NCB; j++)
for(k=0; k<NCA; k++)
c[i][j] += a[i][k] * b[k][j];
t2=f_time(); // get ended time’s moment
printf (“Multiplay time= %.3lf sec\n\n”, t2-t1);
printf(“Here is the result matrix:\n”);
for (i=0; i<NRA; i++)
{
printf(“\n”);
for (j=0; j<NCB; j++)
printf(“%6.2f “, c[i][j]);
}
printf (“\n”);
} // end of MM_SER.C program
Результат программы:
Листинг программы 2 части:
// source code of MM_MPI_2.C program
// Ros Leibensperger / Blaise Barney. Converted to MPI: George L.
#include “mpi.h”
#include <stdio.h>
#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 */
#define MASTER 0 /* taskid of MASTER task */
#define FROM_MASTER 1 /* setting a message type */
#define FROM_WORKER 2 /* setting a message type */
#define M_C_W MPI_COMM_WORLD
int main(int argc, char *argv[])
{
int numtasks, /* number of tasks in partition */
taskid, /* a task identifier */
numworkers, /* number of worker tasks */
source, /* task id of message source */
dest, /* task id of message destination */
rows, /* rows of matrix A sent to each worker */
averow, extra, offset, /* used to determine rows sent to each worker */
i, j, k, rc; /* indexes */
double a[NRA][NCA], /* matrix A to be multiplied */
b[NCA][NCB], /* matrix B to be multiplied */
c[NRA][NCB], /* result matrix C */
t1,t2; // time’s momemts
MPI_Status status;
rc = MPI_Init(&argc,&argv);
rc|= MPI_Comm_size(M_C_W, &numtasks);
rc|= MPI_Comm_rank(M_C_W, &taskid);
if (rc != MPI_SUCCESS)
printf (“error initializing MPI and obtaining task ID information\n”);
else
printf (“task ID = %d\n”, taskid);
numworkers = numtasks-1;
/**************************** master task ******************************
if (taskid == MASTER)
{
printf(“Number of worker tasks = %d\n”,numworkers);
for (i=0; i<NRA; i++)
for (j=0; j<NCA; j++)
a[i][j]= i+j;
for (i=0; i<NCA; i++)
for (j=0; j<NCB; j++)
b[i][j] = i*j;
/* send matrix data to the worker tasks */
averow = NRA/numworkers;
extra = NRA%numworkers;
offset = 0;
t1=MPI_Wtime(); // get start time’s moment
for (dest=1; dest<=numworkers; dest++)
{
if(dest <= extra)
rows = averow + 1;
else
rows = averow;
rows = (dest <= extra) ? averow+1 : averow;
printf(“...sending %d rows to task %d\n”, rows, dest);
MPI_Send(&offset, 1, MPI_INT, dest, FROM_MASTER, M_C_W);
MPI_Send(&rows, 1, MPI_INT, dest, FROM_MASTER, M_C_W);
MPI_Send(&a[offset][0], rows*NCA, MPI_DOUBLE, dest, FROM_MASTER,
MPI_Send(&b, NCA*NCB, MPI_DOUBLE, dest, FROM_MASTER, M_C_W);
offset += rows;
}
/* wait for results from all worker tasks */
for (source=1; source<=numworkers; i++)
{
MPI_Recv(&offset, 1, MPI_INT, source, FROM_WORKER, M_C_W, &status);
MPI_Recv(&rows, 1, MPI_INT, source, FROM_WORKER, M_C_W, &status);
MPI_Recv(&c[offset][0], rows*NCB, MPI_DOUBLE, source, FROM_WORKER,
}
t2=MPI_Wtime(); // get ended time’s momemt
printf (“Multiply time= %.3lf sec\n\n”, t2-t1);
printf(“Here is the result matrix:\n”);
for (i=0; i<NRA; i++)
{
printf(“\n”);
for (j=0; j<NCB; j++)
printf(“%6.2f “, c[i][j]);
}
printf (“\n”);
}
/**************************** worker task ******************************
if (taskid > MASTER)
{
MPI_Recv(&offset, 1, MPI_INT, MASTER, FROM_MASTER, M_C_W, &status);
MPI_Recv(&rows, 1, MPI_INT, MASTER, FROM_MASTER, M_C_W, &status);
MPI_Recv(&a, rows*NCA, MPI_DOUBLE, MASTER, FROM_MASTER,
MPI_Recv(&b, NCA*NCB, MPI_DOUBLE, MASTER, FROM_MASTER,
for (k=0; k<NCB; k++)
for (i=0; i<rows; i++)
{
c[i][k] = 0.0;
for (j=0; j<NCA; j++)
c[i][k] += a[i][j] * b[j][k];
}
MPI_Send(&a_offset, 1, MPI_INT, MASTER, FROM_WORKER, M_C_W);
MPI_Send(&a_rows, 1, MPI_INT, MASTER, FROM_WORKER, M_C_W);
MPI_Send(&c, a_rows*NCB, MPI_DOUBLE, MASTER, FROM_WORKER,
MPI_Finalize();
} // end of MM_MPI_2.C program
Результат программы:
Контрольные вопросы:
Даже весьма быстродействующая сеть обладает свойством латентности; латентность особо сильно снижает реальную производительность сети при частом обмене (небольшими по объему) сообщениями (при задержке поступления очередного порции информации вычислительному узлу он вынужденно простаивает). Тем самым, общая скорость обмена существенно снижается от скорости, заявленной изготовителем.
Латентность - ‘времени разгона’ до
номинальной
Цена обмена – размер блока данных, которые канал ‘точка-точка’ мог бы передать при нулевой латентности, МБ.
В случае одностороннего обмена сообщениями между двумя узлами (обмен типа ‘точка-точка’) затрачиваемое на передачу время Т (сек) оценивается как:
T=X/S+L,
где X – длина сообщения (Mбайт),
S – пропускная способность
L – время разгона операции обмена (не зависит от длины сообщения), сек.
Иногда бывает удобно оперировать латентностью, приведенной к скорости (цена обмена P, Мбайт):
P=LxS,
Как зависит реальная производительность сети от размера передаваемых сообщений? При сообщениях какой длины производительность сети достигает (теоретического) уровня?
При определении реальной (с учетом латентности) пропускной способности сети на операциях обмена типа ‘точка-точка’ используют пару простейших блокирующих (блокирующие функции возвращают управление вызывающему процессу только после того, как данные приняты или переданы или скопированы во временный буфер) MPI-предписаний MPI_Send/MPI_Recv, причем каждая операция повторяется много раз (с целью статистического усреднения).
Для виртуального кластера максимально достижимая реальная производительности коммуникационной сети достигается при размере сообщений более 128/256 kбайт, при этом величина латентности может достигать 300/400 мксек (что является платой за виртуальное совмещение сетей управления и коммуникаций единой физической Fast Ethernet-сетью).
При виртуализации сети общая физическая сеть разбивается на множество виртуальных подсетей. При этом по единой сети могут передаваться различные данные, предназначенные для каждой виртуальной сети. Для оптимального быстродействия, как правило, размеры передаваемых/принимаемых данных имеют небольшие размеры. При разбивании одного общего пакета на множество меньших подпакетов приводит к увеличению латентности, т.е. времени разгона сети.
Даже весьма быстродействующая сеть обладает свойством латентности; латентность особо сильно снижает реальную производительность сети при частом обмене (небольшими по объему) сообщениями (при задержке поступления очередного порции информации вычислительному узлу он вынужденно простаивает). Тем самым, общая скорость обмена существенно снижается от скорости, заявленной изготовителем.
Латентность - ‘времени разгона’ до
номинальной
Цена обмена – размер блока данных, которые канал ‘точка-точка’ мог бы передать при нулевой латентности, МБ.
Информация о работе Лабораторная работа №1 по дисциплине "Параллельное программирование"