Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Судаков / Лекции / lec8_parall.ppt
Скачиваний:
27
Добавлен:
20.03.2015
Размер:
200.19 Кб
Скачать

Разработка и запуск 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

Соседние файлы в папке Лекции