6 / 6 / 3
Регистрация: 18.10.2010
Сообщений: 140
1

MPI. Разбиение процессов на группы

31.01.2013, 15:28. Показов 3082. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
написал код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
#include <mpi.h>
#include <omp.h>
#include <iostream>
using namespace std; 
int main (int argc, char **argv)
{
   char message[20];
   int rank, rankA,rankB;
   int * ranks;
   int size,halfsize;
   int inc=0;
   int maininc;
   MPI_Group A,B,mainGroup;
 
   MPI_Init (&argc, &argv);
   MPI_Comm_size(MPI_COMM_WORLD,&size); //записываем количество параллельно запущенных процессов в size
   MPI_Comm_rank(MPI_COMM_WORLD,&rank);//получаем ранг этого процесса
   MPI_Comm_group(MPI_COMM_WORLD, &mainGroup);//получаем группу связанную с коммуникатором MPI_COMM_WORLD
   halfsize=size/2;
   ranks=new int[halfsize];
   for(int i=0;i<halfsize;i++)
       ranks[i]=i;
   MPI_Group_incl(mainGroup,halfsize,ranks,&A);//создаем новую группу включающую в себя процессы mainGroups перечисленные в ranks
   MPI_Group_excl(mainGroup,halfsize,ranks,&B);//создаем новую группу включающую в себя процессы mainGroups не перечисленные в ranks
   MPI_Group_rank(A,&rankA);//получаем ранг процесса. Если процесс не состоит в группе А, то MPI_UNDEFINED
   MPI_Group_rank(B,&rankB);//получаем ранг процесса. Если процесс не состоит в группе B, то MPI_UNDEFINED
   MPI_Finalize();
 
    return 0;
}
Все компилируется и запускается без ошибок. Но не уверен, что правильно понимаю одну вещь:
каждый процесс юзает функции MPI_Group_incl MPI_Group_excl, связанные как раз с созданием подгрупп. Получается, что, если нами было запущено 10 одинаковых процессов и каждый процесс создавал по две группы, то на выходе мы получили по 10 этих двух групп. То есть в памяти на тот момент повис 30 экземпляров MPI_Group (10 - A, 10 - B, 10 - mainGroup). В итоге каждый процесс работает со своим А, B, mainGroup (но относится он к mainGroup и к A или B: mainGroup и (А или B)).
Верно ли все вышесказанное?
еще для создания подгрупп есть ф-ция MPI_Comm_split. Но она уже, если так можно выразиться, более высокоуровневая. Там происходит соотнесение процессов коммуникаторам. В чем разница между группой и коммуникатором?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.01.2013, 15:28
Ответы с готовыми решениями:

Вычисление суммы чисел, от параллельных процессов MPI
Задача такая, запускаются параллельно 5 процессов, каждый из них генерит рандомное число и...

QT C++ MPI количество процессов
int main(int argc, char** argv) { int i, size, rank; MPI_Init(&amp;argc, &amp;argv); ...

Разбиение на группы.
Люди, помогите плиз!! я в С# новенький, поэтому не знаю всего! Моя задача состоит в том, чтобы...

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

1
1241 / 960 / 379
Регистрация: 02.09.2012
Сообщений: 2,936
02.02.2013, 16:31 2
Цитата Сообщение от Shepard90 Посмотреть сообщение
Все компилируется и запускается без ошибок. Но не уверен, что правильно понимаю одну вещь:
каждый процесс юзает функции MPI_Group_incl MPI_Group_excl, связанные как раз с созданием подгрупп. Получается, что, если нами было запущено 10 одинаковых процессов и каждый процесс создавал по две группы, то на выходе мы получили по 10 этих двух групп. То есть в памяти на тот момент повис 30 экземпляров MPI_Group (10 - A, 10 - B, 10 - mainGroup). В итоге каждый процесс работает со своим А, B, mainGroup (но относится он к mainGroup и к A или B: mainGroup и (А или B)).
Верно ли все вышесказанное?
Не очень понятно вы сформулировали Ваше высказывание... Он относится и к mainGroup, и к A, и к B. Процесс может относится к любому количеству групп, которое вы захотите. Членство в группе, как бы сказать - ни к чему не обязывает. Это просто принадлежность процесса группе и все. Функции управления группами, если мне не изменяет памяти, являются локальными. Когда дело доходит до создания коммуникатора на основе группе и вы выполняетете какую-то передачу данных, и если вы ошиблись в логике формирования групп, то в лучшем случае вы получить ошибку, в худшем - программа повиснет.

Цитата Сообщение от Shepard90 Посмотреть сообщение
еще для создания подгрупп есть ф-ция MPI_Comm_split. Но она уже, если так можно выразиться, более высокоуровневая. Там происходит соотнесение процессов коммуникаторам. В чем разница между группой и коммуникатором?
группа + контекст = коммуникатор. Понятие Контекст - невидимое пользователю. Это могут быть дополнительные очереди сообщений внутри MPI, или дополнительные фильтры отбора сообщений, принадлежащих только заданной группе. Опять же коммуникатор знает свою группу и может соотнести физический процесс с MPI-процессом. Один физический процесс (MPI-процесс) может существовать в разных группах и контроллироваться, соответственно, разными коммуникаторами. Вообщем контекст - это, то что позволяет MPI разобраться внутри себя, куда передать сообщение при вызове функцйи отправки сообщений, и что отдать пользователю при вызове функций приема сообщений.
1
02.02.2013, 16:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.02.2013, 16:31
Помогаю со студенческими работами здесь

Разбиение множества на группы
Всем привет! Функции подается массив чисел и то число, на которое надо разбить этот массив. ...

Разбиение на группы незнакомых
Имеется N человек и матрица A размера N × N. Элемент Aij матрицы равен 1, если человек i знаком с...

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

Разбиение числе от 1 до n на группы с простой суммой
Столкнулся с интересной задачей, пока не решил =). Дано число n (1 &lt; n &lt; 5000). Требуется...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru