Основы параллельного программирования вычислительных систем с распределенной и разделяемой памятью

Автор работы: Пользователь скрыл имя, 05 Июня 2013 в 22:25, курсовая работа

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

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

Содержание

Введение 4
1 Общие представления о параллельном программировании 6
2 Архитектура параллельных компьютеров 8
2.1 Развитие архитектуры компьютера 8
2.2 Организация памяти параллельных компьютеров 10
2.3 Сети межсоединений 15
2.3.1 Свойства сетей межсоединений. Статические сети межсоединений 16
2.3.2 Динамические сети межсоединений 19
3 Введение в программирование с использованием передачи сообщений 22
3.1 Введение в MPI 22
3.1.1 MPI-коммуникация типа «точка-точка» 25
3.1.2 Тупиковые ситуации при коммуникациях типа «точка-точка» 30
3.1.3 Неблокирующие операции и режимы коммуникации 33
3.1.4 Коммуникационный режим 35
3.2 Групповые коммуникационные операции 36
3.3 Группы процессов и коммуникаторы 41
3.3.1 Группы процессов в MPI 41
3.3.2 Топологии процессов 45
3.3.3 Временные и прерывающие процессы 49
4 Введение в потоковое программирование в OpenMP 50
4.1 Проблемы поточной обработки цикла 52
4.2 Условия гонок 52
4.3 Управление общими и приватными данными 53
4.4 Планирование и разбиение циклов 55
4.5 Библиотечные функции ОреnМР 57
4.6 Отладка 58
4.7 Производительность 59
4.8 Основные моменты 61
5 Протокол сеансового уровня SSH 63
6 Удаленный вход на кластер 66
7 Операционная система Linux 68
7.1 Интерфейс ОС Linux 68
7.2 Некоторые команды Linux 68
8 Компилирование последовательных программ (Fortran/C/C++) 71
9 Основные команды 72
10 Работа с кластером 74
Список использованных источников информации 83

Вложенные файлы: 1 файл

Cluster.doc

— 829.00 Кб (Скачать файл)

 Заметим, что каталог пользователя  находится в папке /home/user_name корневого  каталога системы.

7.2 Некоторые команды Linux

 

            Ниже приводятся  некоторые наиболее употребляемые команды Linux. Чтобы получить более полную информацию по любой отдельной команде command, нужно ввести

man command

Выход из описания команды производится при нажатии клавиши «q».

Работа с каталогами

pwd – показывает название текущей директории;

cd dir – устанавливает текущим каталогом каталог с именем dir, вызов команды cd без параметров возвращает в домашний каталог /home/username ($HOME);

mkdir subdir – создает новый подкаталог с именем subdir;

rmdir subdir – удаляет пустой подкаталог с именем subdir;

ls – показывает список файлов и подкаталогов текущей директории,

ls dir – показывает список файлов и подкаталогов каталога dir;

ls –A - показывает все файлы, в том числе и скрытые;

ls –l - показывает атрибуты (владелец, разрешение на доступ, размер файла и время последней модификации);

mv oldname newname - изменяет имя подкаталога или перемещает его;

cp -R dirname destination - копирует подкаталог dirname в другое место destination.

Работа с файлами

file filename(s) - определяет тип файла (например, ASCII , JPEG image data и др.)

cat filename(s) - показывает содержание файлов (используется только для текстовых файлов!);

more filename(s) - действует так же, как и cat, но позволяет листать страницы;

less filename(s) – улучшенный вариант команды more;

head filename - показывает первые десять строк файла filename;

tail filename - показывает последние десять строк файла filename;

wc filename(s) - показывает число строк, слов и байт для указанного файла;

rm filename(s) - уничтожает файлы или директории, для рекурсивного удаления следует использовать rm с ключом -rf.

cp filename newname - создает копии файлов с новыми именами;

cp filename(s) dir- копирует один или более файлов в другой каталог;

mv oldname newname - изменяет имя файла или каталога;

mv filename(s) dir - перемещает один или более файлов в другой каталог;

find dir -name filename - пытается локализовать файл (подкаталог) filename рекурсивно в подкаталоге dir.

Другие полезные команды.

passwd - изменяет пароль пользователя системы Linux; требует подтверждения старого;

who – показывает, кто в настоящее время работает в сети;

finger – дает более подробную информацию о пользователях сети;

write – позволяет послать сообщение пользователю, работающему в сети в данное время;

top - отображает информацию о процессах, использующих процессоры узла;

ps –U user_name - показывает номера процессов(pid), инициированных пользователем user_name;

kill xxxxx – досрочно завершает работы процесса с номером xxxxx;

killall proc_name— досрочно завершает  работу процесса proc_name;

date - отображает дату и время;

cal – показывает календарь.

exit – выйти из терминала

clear – очистить окно терминала

du dir– показывает занятое место  в директории dir

Для облегчения взаимодействия с ОС были предложены программы-оболочки, которые делают наглядным и простым выполнение следующих базовых операций над файлами и каталогами:

-перемещение по каталогам и подкаталогам;

-создание и удаление подкаталога;

-просмотр, редактирование файла;

-копирование, перенос, переименование, удаление файлов;

-запуск программ и др.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  8 Компилирование последовательных программ (Fortran/C/C++)

 

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

 В случае если была подготовлена  программа на FORTRAN, то соответствующий  текстовый файл должен иметь  расширение .f иди .for (например, myprog.f) для программы написанной в соответствии со стандартом FORTRAN 90 - .f90. Чтобы произвести его компиляцию, нужно ввести команду:

ifort – O myprog.f –o myprog.exe

Опция – О означает, что будет  создан рабочий модуль, оптимизированный с точки зрения скорости выполнения программы, если компилятор не обнаружит  ошибки. Подчеркнутая часть команды говорит о том, что рабочий модуль будет иметь имя myprog.out. Если же эта часть будет опущена, то имя рабочей программы будет a.out.

Для компиляции программ, написанных на языке программирования C (С++), используется программа iсc. Более подробно о ifort и icc можно узнать, выполнив команды:

man ifort

man icc.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

9 Основные команды

qstat — утилита для просмотра состояния очереди заданий. По команде «qstat -f» на экране выводится полный список задач с параметрами.

qsub — утилита для установки задачи в очередь на выполнение. По данной команде в очередь на выполнение будет поставлен сценарий оболочки, из которого происходит запуск самой вычислительной задачи. При постановке задачи на выполнение пользователь указывает требуемое количество ресурсов, а также дополнительные параметры, такие как: рабочая директория, имена файлов вывода стандартных поток stdout и stderr, имена переменных для передачи в качестве системного окружения задачи и т.д. Полное описание ресурсов задачи можно получить по команде man pbs_resources, а описание атрибутов задачи по команде man pbs_job_attributes.

Пример

qsub script.sh

Синтаксис script.sh

#PBS -o $DIR/stdout.log

Определяет имя файла, в который  будет перенаправлен стандартный  поток stdout

#PBS -e $DIR/stderr.log

Определяет имя файла, в который  будет перенаправлен стандартный  поток stderr

#PBS -l nodes=8:ppn=2:cpp=1

Определяет какое количество узлов  и процессоров на них необходимо задействовать.  

nodes -  количество узлов  

ppn - число процессоров на узле   

cpp - число процессов на процессоре

#PBS -l walltime=20:00:00

Определяет максимальное время  счета задания

#PBS -l mem=1000mb

Определяет количество необходимой  оперативной памяти

cat $PBS_NODEFILE | grep -v master | sort | uniq -c   | awk '{printf "%s:%s\n", $2, $1}' > $PBS_O_WORKDIR/temp.tmp

Составляет список узлов в необходимом  формате, на которых будет запущена задача и записывает их в файл temp.tmp

cd $PBS_O_WORKDIR

/usr/bin/mpirun.ipath -m temp.tmp –np 100 ./a.out

Запускает на узлах указанных в  файле temp.tmp задачу 100 раз.

Пример скрипта:

#PBS -o $DIR/stdout.log

#PBS -e $DIR/stderr.log

#PBS -l nodes=50:ppn=2

#PBS -l walltime=20:00:00

#PBS -l mem=1000mb

cat $PBS_NODEFILE | grep -v master | sort | uniq -c   | awk '{printf "%s:%s\n", $2, $1}' > $PBS_O_WORKDIR/script1.temp.sh.mf

cd $PBS_O_WORKDIR

/usr/bin/mpirun.ipath -m script1.temp.sh.mf -np 100 ./a.out           

 Здесь будет запущена параллельная программа a.out на 50 узлах, с каждого узла будет использоваться 2 процессора. Файл вывода стандартного потока stdout — stdout.log, стандартного потока stderr — stderr.log. $DIR содержит путь к файлам stdout.log и stderr.log, например может принимать значение /home/user_name. Под задачу отведено 20 часов. Необходимое количество памяти 1000 мегабайт.           

 Для запуска последовательной  программы first.exe можно использовать следующий скрипт:

#PBS -o $DIR/stdout.log

#PBS -e $DIR/stderr.log

#PBS -l walltime=10:00

#PBS -l mem=100mb

./first.exe           

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

qsub script.sh

Starting MPI job under Torque resource manager...

20213.master.cyberia.tsu.ru

Здесь идентификатор 20213.

qdel – утилита для удаления задачи.            

 Выполнение такой команды  удалит задачи с заданными идентификаторами через указанное время. Если часть вычислительных узлов, на которых выполнялась задача, недоступны, то принудительно удалить ее с сервера можно путем добавления ключа -p.

Более подробное описание синтаксиса команд можно получить, выполнив команду

man имя_утилиты.

10 Работа с кластером

В данном разделе будет рассмотрена  работа с кластером в Московском Государственном Техническом Университете МГТУ имени Н.Э. Баумана. Работа будет проводиться из аудитории 805 Главного Здания.

1. Включить компьютер

 

2. При загрузке выбрать тип  операционной системы (ОС):

В данном случае «Ubuntu 8.04.4 LTS kernel 2.6 24-24 (generic)»

 

3. Ввести «Имя пользователя»: student

 

4. Ввести «Пароль»: student

Будет произведен вход в систему, появится графическая оболочка ОС Linux.

 

5. Открыть терминал:

В данном случае, в левом верхнем углу найти пункт меню «Приложения» →«Стандартные» →«Терминал».

На экране появится окно терминала  с надписью:

student@xxx-yy:~$

где yy – номер компьютера.

 

6. Установить ssh-соединение с кластером командой:

ssh barsic@195.19.33.110

где «barsic» - имя пользователя, 195.19.33.110 – ip-адрес кластера (после ввода команды нажать Enter)

Далее придется подождать некоторое  время отклика системы. Ответом  служит строка запроса пароля:

barsic@195.19.33.110's password:

 
  1. Ввести пароль для кластера: ruric

Введенный пароль не отображается на экране, после ввода нажать Enter. Дождаться появления отклика:

[16:16 barsic@mgmt ~]$

 

8. Перейти в домашнюю директорию:

cd $HOME

При нахождении в домашней директории в начале строки стоит:

[16:20 barsic@mgmt ~]$

(знак ~ указывает  на домашнюю директорию)

 

9. Создать папку для выполнения  лабораторной работы:

mkdir klaster

где «klaster» - название папки (произвольно).

Чтобы проверить, создана ли папка  ввести команду:

ls

ответом будет список всех папок  текущей директории (в данном случае директории home):

[16:52 barsic@mgmt ~]$ls

8laba_rabotaet  EXAMPLES     helloworld1  lab6         primer3     testcat

bin             hello        klaster      laba7        PRJ7        work

code1           hello.c.exe  lab10        mbox         proektname  work1

common          helloworld   lab4         Nik_Bor_Pyr  project1

Dragovich       Hello_World  lab5         Popov        test

 

9. Не закрывая текущий терминал, открыть еще один, выполнив п.5

В окне терминала будет выведено:

student@805-24:~$

 

11. Скопировать файлы *.job и *.c на кластер. Для примера hello_world это будут файлы hello.job и hello.c (имена файлов изначально назначаются произвольно).

scp hello.job barsic@195.19.33.110:klaster/

где «klaster/» указывает на папку назначения

Далее вводим пароль для пльзователя (ruric) и ждем ответа:

student@805-24:~$ scp hello.job barsic@195.19.33.110:klaster/

barsic@195.19.33.110's password:

hello.job                   100% 1815     1.8KB/s   00:00

Для создания файлов необходимо открыть  текстовый редактор в меню «Стандартные» (см.п.5) и скопировать туда текст  программ из методички (тексты для рассмотренных  примеров помещены в конце). В текст  файла задания (*.job) внести необходимые изменения. Файлы сохранить в папке student с соответствующим именем (например, hello) и расширением job или с.

 

12. В соответствии с п.11 копируем  на кластер файл *.с:

scp hello.с barsic@195.19.33.110:klaster/

В папке klaster должны появиться скопированные файлы:

[16:56 barsic@mgmt ~]$cd klaster

[16:56 barsic@mgmt ~/ klaster]$ls

hello.job  hello.c 

 

 

13. Скомпилировать программу:

Если в терминале  выведено [16:56 barsic@mgmt ~/ klaster]$, то перейти непосредственно к компиляции, иначе - [16:56 barsic@mgmt ~] - набрать:

cd klaster (для перехода в папку klaster)

mpicc -o hello.c.exe hello.c

Если компиляция прошла успешно, то ответа не будет. При нахождении ошибок в программе будет выдано сообщение  о невозможности компиляции с описанием ошибки, например:

hello.c:4: warning: return type of ‘main’  is not ‘int’

 

14. Поставить программу в очередь  на выполнение:

llsubmit hello.job

При успешной постановке в очередь  последует отклик с номером Вашего задания:

llsubmit: The job "mgmt.nodes.878" has been submitted.

 

15. Проверить выполнение программы:

llq

Ответом послужит таблица:

[16:23 barsic@mgmt ~/klaster]$llq

Id           Owner   Submitted  ST PRI Class        Running On

----------- ------- ----------- -- --- ------------ -----------

mgmt.878.0  barsic  11/1 16:23   R  50  small_mpi    n1102

 

16. Проверить содержимое файлов *. stdout и *.stderr:

nano hello.barsic.878.stdout

nano hello.barsic.878.stderr

Для того, чтобы узнать имена выходных файлов, можно набрать команду ls и найти нужное название в выведенном списке.

Текстовый редактор nano открывает файл для просмотра и редактирования. Для выхода нажать Ctrl+x, далее ‘y’ или ‘n’ для сохранения изменений/сохранения без изменений соответственно.

 

 

17. Можно закрыть все окна

 

 

 

 

 

Файл задания hello.job выглядит следующим образом:

#!/bin/bash

#Название задания (может включать в себя любую комбинацию букв и цифр

#@job_name = hello

#Тип задания: может быть последовательный или параллельный.

#Выберем параллельный тип задания

#@job_type = MPICH

#@class = small_mpi

#@group = loadl

#STDIN для задания – имя файла или /dev/null по умолчанию

#@ input = /dev/null

#STDOUT для задания (выходные данные)

#По умолчанию: /dev/null

#@ output = /gpfs/home/barsic/klaster/hello.$(user).$(jobid).stdout

#STDERR для задания (вывод ошибок)

#@ error = /gpfs/home/barsic/klaster/hello.$(user).$(jobid).stderr

#@ initialdir = /gpfs/home/barsic/klaster/

#notification - Specifies when the user specified in the notify_user keyword is sent mail.

#Syntax: notification = always|error|start|never|complete

#@ notification = complete

#node – Минимальное и максимальное число узлов, необходимое шагу задания.

#Syntax: node = [min][,max]

#@ node = 32

#@ tasks_per_node = 2

#node_usage – Показывает разделяет ли данный шаг задания узлы с другими шагами.

#Syntax: node_usage = shared | not_shared

#@ node_usage = shared

#Необходимо выражение queue, помещающее шаг задания в очередь

#@ queue

echo "-------------------------------------------------------"

echo LOADL_STEP_ID = $LOADL_STEP_ID

echo HOSTNAME: `hostname`

echo "-------------------------------------------------------"

mpdboot -r ssh -n `cat $LOADL_HOSTFILE|sort|uniq|wc -l` -f $LOADL_HOSTFILE

mpirun -r ssh -machinefile $LOADL_HOSTFILE -n $LOADL_TOTAL_TASKS  ./hello.c.exe 100000

mpdallexit

Выделенные фрагменты текста файла задания различаются для различных задач. Имя проекта (#@job_name = hello) задается произвольно (желательно, чтобы название как-то отражало суть выполняемой программы). Путь для выходных файлов зависит от имени пользователя (barsic) и папки назначения (klaster). Имя исполняемого файла задается при компиляции программы (hello.c.exe). Количество повторений запуска программы задается числом (100000).

Ниже следует текст MPI-программы  hello.c, которая выводит на экран приветствия от каждого процесса.

/* hello.c */

#include <stdio.h>

/* Необходимо подключить  для  MPI_* функций */

#include "mpi.h"

int main(int argc, char **argv) {

   int rank;

   char host[150];

   int namelen;

   /* Инициализация MPI. Тут передаются специфические для командной строки mpich аргументы */

   MPI_Init(&argc, &argv);

   /* Получение номера  процесса. Номер rank сохраняется в  переменную 'rank' */

   MPI_Comm_rank(MPI_COMM_WORLD, &rank);

   /* Узнаем на котором компьютере запущено. Сохраним имя в 'host' */

   MPI_Get_processor_name(host,&namelen);

   printf("Hello world (Rank: %d / Host: %s)\n", rank, host);

   fflush(stdout);

   /* Заключение: Закрываем  соединения к остальным дочерним  процессам, очистка памяти

   * где была расположена библиотека MPI и т д */

   MPI_Finalize();

   return 0;

}

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

student@805-24:~$ ssh barsic@195.19.33.110

barsic@195.19.33.110's password:

Информация о работе Основы параллельного программирования вычислительных систем с распределенной и разделяемой памятью