Новости

Вычислительные кластеры

Работа добавлена:






Вычислительные кластеры на http://mirrorref.ru

Санкт-Петербургский государственный политехнический университет

Факультет технической кибернетики

—————————

Кафедра информационной безопасности компьютерных систем

ОТЧЕТ

по лабораторной работе №5

«Вычислительные кластеры»

по курсу «Операционные системы»

Студент:

Казарин К.А.

гр. 2088/3

Преподаватель:

Калинин М.О.

Санкт-Петербург — 2010

1. Формулировка задания

Разработать программу с использованием MPI, осуществляющую поиск максимального элемента в массиве. Запуск программы выполнить на кластерах MPICH и BCCD с двумя и тремя узлами. Оценить быстродействие программы в каждом случае

2. Использованные теоретические сведения

http://www.opennet.ru/docs/RUS/linux_parallel/

http://cluster.linux-ekb.info/QuickStart1.php

http://www.linux.org.ru/news/clusters/4438371

http://www.ccas.ru/mmes/educat/lab04k/

http://cluster.linux-ekb.info/mpi2.php

http://www.opennet.ru/docs/RUS/linux_parallel/

http://www.intuit.ru/department/calculate/paralltp/5/

http://www.intuit.ru/department/se/parallprog/1/

http://bccd.net/#q1

http://cluster.linux-ekb.info/ubuntu.php

.

3. Результаты работы

Ход работы:

установка mpich2

apt-get install mpich2

===========================

"...cannot connect to local mpd..."

===========================

запустить демон mpd

mpdboot

 или

mpd &

он попросит создать файл mpd.conf и предложит такой способ:

cd $HOME

touch .mpd.conf

chmod 600 .mpd.conf

 (вынесено в отдельный скрипт)

в файле mpd.conf прописать такую строку:

MPD_SECRETWORD=test

и можно снова запускать демон

mpdboot

 или

mpd &

============================

mpdboot берет по умолчанию конфигурацию кластера (список машин, входящих в кластер) из файла mpd.hosts

дополнительно:

компиляция

mpic++ main.cpp -o main

запуск

mpirun -np /количество точек/ /путь к проге/

теперь немного о пеликане – аналогbccd  -загружаемая с диска вlife режиме система – полностью самодостаточна и готова к настройке кластера.

Для развертывания такого виртуального кластера вам потребуется один компакт-диск с последней версией дистрибутива PelicanHPC GNU Linux, iso-образ которого вы можете взять отсюда. С этого диска вы загружаете операционную систему кластера (не устанавливая ее на винчестер) на компьютере, который будет играть роль консоли кластера, то есть того компьютера, непосредсвенно за которым вы будете работать, компилируя и запуская ваши параллельные программы.

Остальные узлы кластера будут загружаться по сети. Для загрузки ОС вычислительных узлов кластера по сети необходимо, чтобы сетевые карты этих компьютеров умели выполнять загрузку по сети. Большинство современных карт, в том числе встроенных, это делать умеют.

Теперь посмотрим, как на практике выполняется загрузка кластера.

Загружаем консоль кластера с PelicanHPC GNU Linux Live CD

Через некоторое время повяляется следующий запрос:

Здесь вы должны будете указать устройство, на котором будет располагаться пользовательский каталог. То есть ваш рабочий каталог, где будут храниться ваши программы, исходники и файлы данных. По умолчанию вам предложен раздел на виртуальном диске, расположенном в оперативной памяти. Это самый простой вариант, однако не самый удобный в том смысле, что после выключения компьютера все данные на этом диске будут уничтожены. В этом случае вам придется каждый раз перед выключением сохранять ваши данные на внешний носитель, например на флешку. Более удобным будет, если вы выделите на винчестере компьютера отдельный раздел для ваших данных. Как вариант может рассматриваться подключение внешнего носителя (флешки либо USB-винчестера). В таком случае вместо предложенного ram1 вы должны будуте указать что-то типа hda7, sda5, sdb1 и т.д. в зависимости от конфигурации вашей машины и выбранного варианта.

Следующий вопрос, который будет вам задан, выглядит так:

Система спрашивает, будет ли выполнена начальная конфигурация пользовательского каталога. В случае, когда вы используете в качестве пользовательского каталога виртуальный диск ram1, всегда отвечайте "Yes". Если же вы выбрали в качестве месторасположения пользовательского каталога постянный носитель (раздел винчестера компьютера, флешку или внешний USB-винчестер), тогда ответ "Yes" вы должны будете выбрать только в самый первый раз. Во все последующие загрузки кластера необходимо выбрать ответ "No".

На следующем шаге вы должны будете указать пароль пользователя, с которым вы будете подключаться в систему:

После задания пароля вам будет предложен стандартный экран входа в систему:

Для входа в систему вы можете использовать логин "user" и пароль, который вы определили на предыдущем шаге.

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

Естественно, мы говорим "Yes".

Сконфигурировав сервер сетевой загрузки, программа предложит нам выполнить загрузку всех стальных узлов кластера:

В этот момент мы должны включить все остальные компьютеры кластера, не забыв поправить настроики BIOS таким образом, чтобы они выполнили загрузку по сети. Вмешательства в процесс загрузки вычислительных узлов кластера не требуется. Надо просто дождаться, когда они все закончат процедуру загрузки, о чем будет свидетельствовать следующая картинка на экранах этих конмпьютеров:

После того, как все компьютеры будут загружены, нажимаем кнопку "Yes".

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

На этом экране программа сообщает нам, сколько было найдено вычислительных узлов (в данном случае два) кроме узла, который является консолью кластера. Если все нормально - нажимаем "Yes".

И, наконец, программа конфигурации кластера сообщает нам, что все настройки выполнены и кластер готов к эксплуатации:

Нам остается только завершить ее, нажав "ОК".

В некоторых случаях у меня конфигурация кластера завершалась с ошибкой, поэтому я рекомендую следующим шагом запустить скрипт реконфигурации: pelican_restart_hpc, тем самым повторив заново пункты 7-9.

Теперь кластер работоспособен. проверим его работу на тестовой программе. Возьмем в качестве пример программу вычисления числа  flops.f. Каким-либо способом копируем исходник этой программы в пользовательский каталог на консоли кластера. Далее выполняем следующие действия:

Компилируем программу в параллельной среде MPI с помощью команды mpif77 flops.f -o flops

Запускаем программу на одном процессоре командой ./flops

Запускаем программу на двух процессорах командой mpirun n2,0 ./flops

Написанна программа выполняющая паралельный поиск – произведена ее компиляция с исп. БиблиотекиMPICH и на готовом кластере типаBCCD (был использован его более легкий аналог -Pelican)

Ответы на контрольные вопросы

  1. MPI – интерфейс передачи сообщений – стандарт на программный инструментарий для обеспечения связи между отдельными процессами параллельной задачи.

  1. MPI_COMM_RANK – определение номера процесса в группеcomm.

  1. ПарадигмаSPMD – при запуске программы создается группа из Р процессов поведение всех процессов описывается одной программой.

  1. Блокирующие функции используются для выхода из операций точка-точка после полного окончания операции.

4. Выводы

Приложение

Исходные тексты программ

#include<mpi.h>

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#define N_COUNT                 12

#define RANK_SERVER_PROCESS     0

int mainClient(int nProcessesCount,int iRank,long *pArray,int nCount);

void clientFindMax(long *pArray,int nCount,long &iMax);

int mainServer(int nProcessesCount,int iRank,long *pArray,int nCount);

int main(int argc,char *argv[])

{

int iResult;

long lStaticArray[N_COUNT] = {2, 4, 6,

                                3, 5, 7,

                                1, 0, 9,

                                0, 0, 0};

//  Инициализация для коммуникаций

/*

    * MPI_Init должна быть первой функцией MPI,

    * которую Вы вызываете в каждом процессе.

    * Её можно вызвать только один раз.

    * Она устанавливает окружение необходимое для запуска MPI.

    * Это окружение может быть приспособлено для любых флагов запуска MPI,

    * обеспечиваемых реализацией MPI.

    */

   iResult = MPI_Init(&argc,&argv);

if(iResult != MPI_SUCCESS)

   {

       printf("error MPI_Init: 0x%08x", iResult);

return iResult;

   }

/*

    * MPI_Comm_size возвращает число процессов внутри коммуникатора.

    * Коммуникатор - это механизм MPI для создания

    * отдельных коммуникационных областей ("вселенных") (подробнее об этом позже).

    * Наша пробная программа использует предопределенный "мировой коммуникатор" MPI_COMM_WORLD,

    * который включает все ваши процессы.

    * MPI может определить число процессов, поскольку вы определяете это,

    * когда задействуете команду mpirun, используемую для запуска программ MPI.

    */

int iProcessesCount;

   iResult = MPI_Comm_size(MPI_COMM_WORLD, &iProcessesCount);

if(iResult != MPI_SUCCESS)

   {

       printf("error MPI_Comm_size: 0x%08x", iResult);

return iResult;

   }

if(iProcessesCount < 2)

   {

       printf("Error! Count of processes must be >= 2.\n");

return 1;

   }

/*

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

    * Ранг является целым в интервале от 0 до size - 1,

    * где size есть число процессов, которое возвращает функция MPI_Comm_size.

    * MPI_Comm_rank возвращает ранг вызываемого процесса в точно определенном коммуникаторе.

    *

    * Часто для процесса необходимо знать его собственный ранг.

    * Например, Ваmpirun -np 1 /home/pafnuty/Lab5/mainм может захочется разбить вычислительную работу в цикле по всем вашим процессам,

    * так чтобы каждый процесс выполнял подмножество в исходном диапазоне цикла.

    * Один способ сделать это - для каждого процесса использовать его ранг для вычисления его диапазона в индексах цикла.

    */

int iRank;

   iResult = MPI_Comm_rank(MPI_COMM_WORLD, &iRank);

if(iResult != MPI_SUCCESS)

   {

       printf("error MPI_Comm_rank: 0x%08x", iResult);

return iResult;

   }

if (iRank == 0)

   {

       iResult = mainServer(iProcessesCount, iRank, lStaticArray, N_COUNT);

if(iResult != MPI_SUCCESS)

       {

           printf("error mainServer: 0x%08x", iResult);

//return iResult;

       }

   }

else

   {

       iResult = mainClient(iProcessesCount, iRank, lStaticArray, N_COUNT);

if(iResult != MPI_SUCCESS)

       {

           printf("error mainClient: 0x%08x", iResult);

//return iResult;

       }

   }

   MPI_Finalize();

return 0;

}

int mainClient(int nProcessesCount,int iRank,long *pArray,int nCount)

{

int nProcessElementsCount = nCount / (nProcessesCount - 1);// minus 1 server host

int iStartIndex = nProcessElementsCount * (iRank - 1);

long lMax;

   clientFindMax(&pArray[iStartIndex], nProcessElementsCount, lMax);

/*

        * MPI_Send является блокирующей отправкой.

        * Это означает, что вызов не возвращает управление в вашу программу до тех пор,

        * пока все данные не будут скопированы из расположения,

        * которое вы точно определили в листе параметров.

        * Из-за этого, Вы можете изменить данные после вызова,

        * что не отразится на оригинальном сообщении.

        * (Существуют неблокирующие отправления, в которых это не так.)

        *

        * int MPI_Send(void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)

        *

        * Параметры:

        * buf - начало буфера, содержащего данные, которые будут отосланы. Для C это - адрес.

        * count - число элементов, которые будут отосланы (не байт)

        * datatype - тип данных

        * dest - ранг процесса, места назначения, для сообщения

        * tag - произвольное число, которое можно использовать для отличия от других сообщений

        * comm - (определенный) коммуникатор

        * (ierror - возвращаемый функцией код ошибки).

        */

int iResult = MPI_Send(&lMax, 1, MPI_LONG, RANK_SERVER_PROCESS, iStartIndex, MPI_COMM_WORLD);

if(iResult != MPI_SUCCESS)

   {

       printf("error MPI_Send: 0x%08x", iResult);

return iResult;

   }

return MPI_SUCCESS;

}

void clientFindMax(long *pArray,int nCount,long &lMax)

{

   lMax = pArray[0];

for(int i = 1; i < nCount; i++)

if(pArray[i] > lMax)

           lMax = pArray[i];

}

int mainServer(int nProcessesCount,int iRank,long *pArray,int nCount)

{

long lMax = pArray[0];

long lCurrentMax;

   MPI_Status mpiStatus;

for (int i = 1; i < nProcessesCount; i++)

   {

int iResult = MPI_Recv(&lCurrentMax, 1, MPI_LONG, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &mpiStatus);

if(iResult != MPI_SUCCESS)

       {

           printf("error MPI_Recv: 0x%08x", iResult);

return iResult;

       }

else

       {

           printf("Max from Client(%i): %i\n", mpiStatus.MPI_SOURCE, lCurrentMax);

if(lCurrentMax > lMax)

               lMax = lCurrentMax;

       }

   }

   printf("Max = %i\n", lMax);

return MPI_SUCCESS;

}

Вычислительные кластеры на http://mirrorref.ru


Похожие рефераты, которые будут Вам интерестны.

1. Реферат Региональные промышленные кластеры

2. Реферат Кластеры как фактор инновационного развития

3. Реферат ЦИКЛИЧЕСКИЕ ВЫЧИСЛИТЕЛЬНЫЕ ПРОЦЕССЫ

4. Реферат ЭВМ - электронно-вычислительные машины

5. Реферат Вычислительные возможности табличного процессора

6. Реферат Вычислительные алгоритмы линейной алгебры

7. Реферат Локальные вычислительные сети. Состав и архитектура

8. Реферат АВИАЦИОННЫЕ ПРИБОРЫ И ИЗМЕРИТЕЛЬНО-ВЫЧИСЛИТЕЛЬНЫЕ КОМПЛЕКСЫ

9. Реферат ВЫЧИСЛИТЕЛЬНЫЕ СИСТЕМЫ, СЕТИ И ТЕЛЕКОММУНИКАЦИИ ТЕСТОВЫЕ ЗАДАНИЯ

10. Реферат Вычислительные системы, сети и телекоммуникации методичка к лабораторным работам