Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2012, 12:06   #1
Brabus
Пользователь
 
Регистрация: 25.09.2009
Сообщений: 81
По умолчанию Проблема с написанием алгоритма (C++)

Здравствуйте. Я пишу задачу по параллельному программированию и столкнулся с проблемой. Мне необходимо написать алгоритм, который будет назначать процедурам MPI_Recv и MPI_Send правильные адреса получения и передачи from и to.

Например:
Количество итераций = 10;
Количество процессов = 5;
"Степень параллельности " = 1;

Алгоритм:
Код:
			if(myid == 0)
				from = numprocs - 1;
			else
				from = myid - 1;

			if(myid == numprocs - 1)
				to = 0;
			else
				to = myid + 1;
Работа:
1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10.

Количество итераций = 10;
Количество процессов = 5;
"Степень параллельности " = 2;

Алгоритм:
Код:
			if(myid == 0)
				from = numprocs - 2;
			else
				if(myid == 1)
					from = numprocs - 1;
				else
					from = myid - 2;

			if(myid == numprocs - 2)
				to = 0;
			else
				if(myid == numprocs - 1)
					to = 1;
				else
					to = myid + 2;
Работа:
1 -> 3 -> 5 -> 7 -> 9
2 -> 4 -> 6 -> 8 -> 10

Все эти алгоритмы статические и заточены под конкретную "степень параллельности". Мне нужен алгоритм, который бы автоматически выполнял адресацию from и to при указании любой "степени параллельности" не превышающей количество процессов. Помогите мне пожалуйста.
Brabus вне форума Ответить с цитированием
Старый 12.04.2012, 12:48   #2
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

Может быть засунуть условие в функцию и вызывать ее в else?
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Старый 12.04.2012, 13:25   #3
Brabus
Пользователь
 
Регистрация: 25.09.2009
Сообщений: 81
По умолчанию

Это как? Я не понял. Вся сложность в том, что чем больше степень параллельности, тем больше вложенных лог. операторов. Я не знаю как это решить.

Последний раз редактировалось Brabus; 12.04.2012 в 13:28.
Brabus вне форума Ответить с цитированием
Старый 12.04.2012, 13:53   #4
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

суммой по модулю не пробовали идентификаторы сопоставлять?
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 12.04.2012, 14:53   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Код:
			if(myid == 0)
				from = numprocs - 2; // from = numprocs + myid{=0} - 2 {=level}
			else
				if(myid == 1)
					from = numprocs - 1 // from =munprocs  +myid{=1} - 2{=level}
				else
					from = myid - 2 {=level};
Код:
if (myid<=level) 
{ from = numprocs +mvid -level }
else 
{ from =myid -level }
Код:
if (myid<level) {myid+=level}
mtid =myid - level
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 12.04.2012 в 14:55.
evg_m вне форума Ответить с цитированием
Старый 12.04.2012, 15:03   #6
Brabus
Пользователь
 
Регистрация: 25.09.2009
Сообщений: 81
По умолчанию

Я наверное не совсем понятно написал что мне надо. Мне нужен алгоритм, который будет универсальным для любой "степени параллельности". В первом посте первый алгоритм для 1 степени, второй для 2 степени. Для n степени будет n вложенных if then. Как сделать такой алгоритм для n степени?
Brabus вне форума Ответить с цитированием
Старый 13.04.2012, 15:30   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

ваш код
Код:
			if(myid == 0)
				from = numprocs - 2; // from = numprocs + myid{=0} - 2 {=level}
			else
				if(myid == 1)
					from = numprocs - 1 // from =munprocs  +myid{=1} - 2{=level}
				else
					from = myid - 2 {=level};
Код:
			if(myid == 0)
				from = numprocs - 1; // fnum =numpros +myid{=0} -1{=level}
			else
				from = myid - 1;
from =myid -1{=level}
с кучей вложенных if путем замен выделенных в комментариях
СВОДИТСЯ к коду для любого наперед заданного level (что есть level смотри комментарии к исходному коду).
Код:
if (myid<=level) 
{ from = numprocs +mvid -level }
else 
{ from =myid -level }
если быть точнее то сначала ваш код выстраивается так
Код:
if (myd==0) {}
else if (myid=1) {}
.....
else {};
а потом смотри комментарии сводится к выше указанному
if (myid<=level) {}
else {}
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 13.04.2012 в 15:41.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с написанием программы.. super3994 Общие вопросы C/C++ 1 16.11.2011 22:36
Проблема с написанием программы PashkaRus Помощь студентам 3 07.06.2011 11:44
Проблема с написанием .bat файла chet_b Помощь студентам 1 17.10.2010 20:23
проблема с написанием многомодульной программы серг Общие вопросы C/C++ 16 18.03.2010 22:11