Автор работы: Пользователь скрыл имя, 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
Заметим, что каталог
Ниже приводятся
некоторые наиболее употребляем
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
Другие полезные команды.
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
Для облегчения взаимодействия с ОС были предложены программы-оболочки, которые делают наглядным и простым выполнение следующих базовых операций над файлами и каталогами:
-перемещение по каталогам и подкаталогам;
-создание и удаление подкаталога;
-просмотр, редактирование файла;
-копирование, перенос, переименование, удаление файлов;
-запуск программ и др.
После подготовки
текста программы с помощью
текстового редактора
В случае если была
ifort – O myprog.f –o myprog.exe
Опция – О означает, что будет создан рабочий модуль, оптимизированный с точки зрения скорости выполнения программы, если компилятор не обнаружит ошибки. Подчеркнутая часть команды говорит о том, что рабочий модуль будет иметь имя myprog.out. Если же эта часть будет опущена, то имя рабочей программы будет a.out.
Для компиляции программ, написанных на языке программирования C (С++), используется программа iсc. Более подробно о ifort и icc можно узнать, выполнив команды:
man ifort
man icc.
qstat — утилита для просмотра состояния очереди заданий. По команде «qstat -f» на экране выводится полный список задач с параметрами.
qsub — утилита для установки задачи в очередь на выполнение. По данной команде в очередь на выполнение будет поставлен сценарий оболочки, из которого происходит запуск самой вычислительной задачи. При постановке задачи на выполнение пользователь указывает требуемое количество ресурсов, а также дополнительные параметры, такие как: рабочая директория, имена файлов вывода стандартных поток stdout и stderr, имена переменных для передачи в качестве системного окружения задачи и т.д. Полное описание ресурсов задачи можно получить по команде man pbs_resources, а описание атрибутов задачи по команде man pbs_job_attributes.
Пример
qsub script.sh
Синтаксис script.sh
#PBS -o $DIR/stdout.log
Определяет имя файла, в который
будет перенаправлен
#PBS -e $DIR/stderr.log
Определяет имя файла, в который
будет перенаправлен
#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.
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 имя_утилиты.
В данном разделе будет рассмотрена
работа с кластером в Московском
Государственном Техническом
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: |
|
Введенный пароль не отображается на экране, после ввода нажать 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/
#STDERR для задания (вывод ошибок)
#@ error = /gpfs/home/barsic/klaster/
#@ 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|
#@ 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,&
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: