Лабораторная работа №1 по дисциплине "Параллельное программирование"

Автор работы: Пользователь скрыл имя, 13 Декабря 2013 в 13:33, лабораторная работа

Краткое описание

Цель работы: ознакомление с архитектурой, принципами кластерной вычислительной системы и практикой удаленного доступа к вычислительным ресурсам кластера.

Прикрепленные файлы: 1 файл

Отчет по лабам по Параллельному программировнию.doc

— 819.00 Кб (Скачать документ)

} // end of MAIN function

// end of PI_02.C program

 

Результат программы:

 

 

Контрольные вопросы:

 

  1. Чем отличается производительность сети при обмене сообщениями различной длины от заявленной изготовителем?

Даже весьма быстродействующая  сеть обладает свойством латентности; латентность особо сильно снижает  реальную производительность сети при  частом обмене (небольшими по объему) сообщениями (при задержке поступления очередного порции  информации  вычислительному  узлу  он  вынужденно  простаивает). Тем самым, общая скорость обмена существенно снижается от скорости, заявленной изготовителем.

 

  1. Каков физический смысл латентности и цены обмена? В каких единицах они измеряются? Какова количественно цена обмена при определенной Вами величине латентности?

Латентность - ‘времени разгона’ до номинальной производительности, мксек.

Цена обмена – размер блока данных, которые канал ‘точка-точка’ мог бы передать при нулевой латентности, МБ.

В случае одностороннего обмена сообщениями  между двумя узлами (обмен типа ‘точка-точка’) затрачиваемое на передачу время Т (сек) оценивается как:

T=X/S+L, 

где X – длина сообщения (Mбайт),

S – пропускная способность сетевого  канала ‘точка-точка’ (мгновенная  скорость передачи данных), Мбайт/сек, 

L – время разгона операции  обмена (не зависит от длины  сообщения), сек. 

 

Иногда бывает удобно оперировать  латентностью, приведенной к скорости (цена обмена P, Мбайт):

P=LxS,

Как зависит реальная производительность сети от размера передаваемых сообщений? При сообщениях какой длины производительность сети достигает (теоретического) уровня?

При определении реальной (с учетом латентности) пропускной способности сети на операциях обмена типа ‘точка-точка’ используют пару простейших блокирующих (блокирующие функции возвращают управление вызывающему процессу только после того, как данные приняты или переданы или скопированы  во  временный  буфер) MPI-предписаний  MPI_Send/MPI_Recv, причем каждая операция повторяется много раз (с целью статистического усреднения).

Для виртуального кластера максимально  достижимая реальная производительности  коммуникационной  сети  достигается  при  размере  сообщений более 128/256 kбайт,  при этом  величина  латентности может достигать 300/400  мксек (что является  платой  за  виртуальное совмещение  сетей управления и коммуникаций единой физической Fast Ethernet-сетью).

 

  1. Какова причина повышения латентности при виртуализации сетей управления и обмена данными?

При виртуализации сети общая физическая сеть разбивается на множество виртуальных  подсетей. При этом по единой сети могут  передаваться различные данные, предназначенные  для каждой виртуальной сети. Для оптимального быстродействия, как правило, размеры передаваемых/принимаемых данных имеют небольшие размеры. При разбивании одного общего пакета на множество меньших подпакетов приводит к увеличению латентности, т.е. времени разгона сети.

 

 

 

 

 

 

 

 

 

 

 

Федеральное агентство по образованию

Московский государственный  открытый университет

Чебоксарский политехнический  институт

 

 

Кафедра

Информационных технологий и программирования

 

 

 

                                специальность         230105    ___

 (шифр специальности)

 

 

 

 

 

 

 

 

 

Лабораторная работа №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,  

                                                                                                   M_C_W);

         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, 

                                                                                                        M_C_W, &status);

      }

 

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, 

                                                                                          M_C_W, &status);

      MPI_Recv(&b, NCA*NCB, MPI_DOUBLE, MASTER, FROM_MASTER, 

                                                                                          M_C_W, &status);

 

      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, 

                                                                                                              M_C_W); }

   MPI_Finalize();

} // end of MM_MPI_2.C program

Результат программы:

 

 

 

 

Контрольные вопросы:

  1. производительность сети при обмене сообщениями различной длины от заявленной изготовителем?

Даже весьма быстродействующая сеть обладает свойством латентности; латентность особо сильно снижает реальную производительность сети при частом обмене (небольшими по объему) сообщениями (при задержке поступления очередного порции  информации  вычислительному  узлу  он вынужденно  простаивает). Тем самым, общая скорость обмена существенно снижается от скорости, заявленной изготовителем.

 

  1. Каков физический смысл латентности и цены обмена? В каких единицах они измеряются? Какова количественно цена обмена при определенной Вами величине латентности?

Латентность - ‘времени разгона’ до номинальной производительности, мксек.

Цена обмена – размер блока данных, которые канал ‘точка-точка’ мог  бы передать при нулевой латентности, МБ.

В случае одностороннего обмена сообщениями  между двумя узлами (обмен типа ‘точка-точка’) затрачиваемое на передачу время Т (сек) оценивается как:

T=X/S+L, 

где X – длина сообщения (Mбайт),

S – пропускная способность сетевого  канала ‘точка-точка’ (мгновенная  скорость передачи данных), Мбайт/сек, 

L – время разгона операции обмена (не зависит от длины сообщения), сек. 

 

Иногда бывает удобно оперировать  латентностью, приведенной к скорости (цена обмена P, Мбайт):

P=LxS,

Как зависит реальная производительность сети от размера передаваемых сообщений? При сообщениях какой длины производительность сети достигает (теоретического) уровня?

При определении реальной (с учетом латентности) пропускной способности  сети на операциях обмена типа ‘точка-точка’ используют пару простейших блокирующих (блокирующие функции возвращают управление вызывающему процессу только после того, как данные приняты или переданы или скопированы  во  временный  буфер) MPI-предписаний  MPI_Send/MPI_Recv, причем каждая операция повторяется много раз (с целью статистического усреднения).

Для виртуального кластера максимально достижимая реальная производительности  коммуникационной  сети  достигается  при  размере  сообщений более 128/256 kбайт,  при  этом  величина  латентности  может  достигать 300/400  мксек (что  является  платой  за  виртуальное  совмещение  сетей управления и коммуникаций единой физической Fast Ethernet-сетью).

 

  1. Какова причина повышения латентности при виртуализации сетей управления и обмена данными?

При виртуализации сети общая физическая сеть разбивается на множество  виртуальных подсетей. При этом по единой сети могут передаваться различные данные, предназначенные для каждой виртуальной сети. Для оптимального быстродействия, как правило, размеры передаваемых/принимаемых данных имеют небольшие размеры. При разбивании одного общего пакета на множество меньших подпакетов приводит к увеличению латентности, т.е. времени разгона сети.

 

  1. Чем отличается производительность сети при обмене сообщениями различной длины от заявленной изготовителем?

Даже весьма быстродействующая  сеть обладает свойством латентности; латентность особо сильно снижает реальную производительность сети при частом обмене (небольшими по объему) сообщениями (при задержке поступления очередного порции  информации  вычислительному  узлу  он  вынужденно  простаивает). Тем самым, общая скорость обмена существенно снижается от скорости, заявленной изготовителем.

 

  1. Каков физический смысл латентности и цены обмена? В каких единицах они измеряются? Какова количественно цена обмена при определенной Вами величине латентности?

Латентность - ‘времени разгона’ до номинальной производительности, мксек.

Цена обмена – размер блока данных, которые канал ‘точка-точка’ мог  бы передать при нулевой латентности, МБ.

Информация о работе Лабораторная работа №1 по дисциплине "Параллельное программирование"