
- •Технологии
- •План
- •Литература
- •Особенности технологий для параллельных вычислений
- •Требования к параллельным вычислениям
- •Модели параллельных вычислений
- •Топологии параллельных систем
- •Примеры топологий
- •Классы параллельных систем
- •Цель созданий программных технологий параллельных
- •Создание параллельных программ в модели с общей
- •Создание параллельных программ с обменом
- •Языки программирования с поддержкой параллелизма
- •Процессы
- •Составные части процесса
- •Память
- •Файловая система
- •Порождение процессов
- •Доступ к файловой системе
- •Работа с файловой
- •Память общего доступа
- •Конфликты при обращении к общим ресурсам: a – общая переменная
- •Семафоры
- •Синхронизация с помощью семафоров
- •Сигналы
- •Потоки
- •Стандарт OpenMP
- •Пример OpenMP
- •Обмен сообщениями
- •Системные API
- •Сокет
- •Диаграмма работы с
- •Синхронный и асинхронный обмен
- •API для асинхронных операций ввода-вывода
- •Сравнение синхронного и асинхронного ввода-вывода
- •Интерфейсы параллельного программирования
- •Message Passing Interface (MPI)
- •Диаграмма соответвия между сокетами, MPI и др
- •Основные определения
- •Разработка и запуск MPI программ
- •Пример MPI программы
- •Результат работы MPI программы
- •Реализации MPI
- •Parallel Virtual Machine (PVM)
- •Основные компоненты
- •Основные операции
- •Принцип создания параллельных программ
- •Пример запуска машины PVM
- •Пример PVM программы
- •Языки рассчитанные на параллельное
- •Вопросы ?

Разработка и запуск MPI программ
Пользователь разрабатывает программу с MPI вызовами
Программа компилируется и компонуется с соответствующими библиотеками
Запуск программ на удаленных машинах выполняется через rsh,ssh
Все программы выполняют один и тот же код, или разный код

Пример MPI программы
int main(int argc, char* argv[]){
int my_number; |
//Мой номер процесса |
int proc_num; |
//общее количество процессов |
int data; |
//данные, получаемые от других процессов |
int i; |
//парамтер цикла |
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &proc_num);
MPI_Comm_rank(MPI_COMM_WORLD, &my_number);
printf("I an process %d, sending data\n", my_number);
MPI_Send((void*)&my_number,1,MPI_INT,0,0,MPI_COMM_WORLD);
if(!my_number){
printf ("MPI %d processes\n Am root, reciving data, \n",proc_num); for (i = 0; i<proc_num; i++){
MPI_Recv((void*)&data,1,MPI_INT,i,0,MPI_COMM_WORLD, NULL); printf ("Am root, recived data %d from %d \n",data,i);
}
}
MPI_Finalize(); return 0;
}

Результат работы MPI программы
[saa@cluster mpi]$ mpirun -np 10 ./a.out I an process 0, sending data
MPI 10 processes
Am root, reciving data,
Am root, recived data 0 from 0 Am root, recived data 1 from 1 Am root, recived data 2 from 2 I an process 1, sending data
I an process 2, sending data I an process 3, sending data I an process 4, sending data I an process 5, sending data I an process 6, sending data I an process 8, sending data I an process 9, sending data
Am root, recived data 3 from 3 Am root, recived data 4 from 4 Am root, recived data 5 from 5 Am root, recived data 6 from 6 Am root, recived data 7 from 7 Am root, recived data 8 from 8 Am root, recived data 9 from 9 I an process 7, sending data

Реализации MPI
MPICH
LAMMPI
….
Существуют разные реализации
Может отличаться все, кроме совместимости программного кода
Некоторые реализации поддерживают не все особенности стандартов

Parallel Virtual Machine (PVM)
PVM – программные средства для создания параллельных вычислительных комплексов на базе коллекции гетерогенных компьютеров, связанных друг с другом
В отличие от MPI – PVM не только средство взаимодействия, но и средства управления процессами (MPI-2 такж)

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

Основные операции
Управление процессами
Запуск pvm_spawn
Обмен сигналами pvm_kill
Выход pvm_exit
Сериализация/десериализация
Упаковка pvm_pk
Распаковка pvm_up
Отправка/прием
pvm_send
pvm_recv
Управление буфером сообщений
Pvm_initsend
Коллективные операции
Pvm_broadcast

Принцип создания параллельных программ
Пользователь компилирует для всех платформ одну или несколько программ
Программы помещаются каждая в свой каталог для разных платформ
В каждой программе используются вызовы PVM
Запуск программ выполняется через демона pvmd
Запуск демона pvmd через rsh, ssh

Пример запуска машины PVM
[saa@cluster mpi]$ pvm pvmd already running. pvm> conf
conf
1 host, 1 data format
HOST DTID ARCH SPEED DSIG cluster.univ.kiev.ua 40000 LINUXI386 1000 0x00408841
pvm> add s15 add s15
1 successful
HOST DTID s15 1c0000
pvm> conf |
|
|
|
conf |
|
|
|
2 hosts, 2 data formats |
|
|
|
HOST |
DTID ARCH SPEED |
DSIG |
|
cluster.univ.kiev.ua |
40000 LINUXI386 |
1000 0x00408841 |
|
s15 1c0000 LINUXX86_64 |
1000 0x00408c41 |
||
pvm> |
|
|
|
|
|
|
|

Пример PVM программы
#include <stdio.h> #include <pvm3.h> #include <unistd.h>
int main(int argc, char* argv[]){
int p_tid, c_tid; int res;
char message[4096];
p_tid = pvm_mytid(); if(argc < 2) { // child
p_tid = pvm_parent(); pvm_initsend(PvmDataDefault); gethostname(message,4095); pvm_pkstr(message); pvm_send(p_tid,1);
pvm_exit();
} else { |
// parent |
p_tid = pvm_mytid(); |
|
res = |
pvm_spawn("test_pvm",NULL,0,"",1,&c_tid); |
if(res == 1){ |
|
|
pvm_recv(c_tid,1); |
pvm_upkstr(message);
printf("Child is working at %s\n",message); pvm_exit();
}
}
return 0;
}
Результат
[saa@cluster pvm]$ ./test_pvm parent Child is working at cluster.univ.kiev.ua