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

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

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.05.2014, 16:36   #1
Denis++
Новичок
Джуниор
 
Регистрация: 19.05.2014
Сообщений: 4
По умолчанию распараллеливание циклов c++

Добрый день!
Подскажите, пожалуйста, как распараллелить циклы через mpi.

Вот небольшой код.
Код:
i=1;
			do{	//Левый край по координате ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~	
				SumL[1]=0;
				SumC[1]=0;
				k=1;
				do{	SumL[1]=SumL[1]+inversL[i][k]*(2*(ph[k][2]-ph[k][1])-2*H*XP);
					SumC[1]=SumC[1]+C[i][k]*V[k][1];
				}while(++k<=N);
				V1[i][1]=TP*(c1*SumL[1]-beta*V[i][1]-sin(ph[i][1])+I+Irand[i]);
				P1[i][1]=TP*SumC[1];
				//Внутренние точки по координате ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
				x=2;
				do{	SumL[x]=0;
					SumC[x]=0;
					k=1;
					do{	SumL[x]=SumL[x]
							+inversL[i][k]*(ph[k][x+1]-2*ph[k][x]+ph[k][x-1]);
						SumC[x]=SumC[x]+C[i][k]*V[k][x];
					}while(++k<=N);
					V1[i][x]=TP*(c1*SumL[x]-beta*V[i][x]-sin(ph[i][x])+I+Irand[i]);
					P1[i][x]=TP*SumC[x];
				}while(++x<=xN-1);
				//Правый край по координате ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
				SumL[xN]=0;
				SumC[xN]=0;
				k=1;
				do{	SumL[xN]=SumL[xN]+inversL[i][k]*(2*(ph[k][xN-1]-ph[k][xN])+2*H*XP);
					SumC[xN]=SumC[xN]+C[i][k]*V[k][xN];
				}while(++k<=N);
				V1[i][xN]=TP*(c1*SumL[xN]-beta*V[i][xN]-sin(ph[i][xN])+I+Irand[i]);
				P1[i][xN]=TP*SumC[xN];
			}while(++i<=N);

Последний раз редактировалось Stilet; 22.05.2014 в 11:05.
Denis++ вне форума Ответить с цитированием
Старый 20.05.2014, 15:40   #2
Denis++
Новичок
Джуниор
 
Регистрация: 19.05.2014
Сообщений: 4
По умолчанию

Помочь по данному вопросу видимо никто не сможет?
Denis++ вне форума Ответить с цитированием
Старый 20.05.2014, 16:28   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Самый просто вариант - используйте директивы для mpi. Посложнее - надо знать алгоритм или вначале тупо разбить циклы по счетчику, если они независимы.
p51x вне форума Ответить с цитированием
Старый 20.05.2014, 17:03   #4
Denis++
Новичок
Джуниор
 
Регистрация: 19.05.2014
Сообщений: 4
По умолчанию

Самый просто вариант - используйте директивы для mpi.

А можно по подробнее, спасибо.

Есть вариант использовать MPI_Send и MPI_Recv т.е. передача с блокировкой.
Denis++ вне форума Ответить с цитированием
Старый 21.05.2014, 22:31   #5
Denis++
Новичок
Джуниор
 
Регистрация: 19.05.2014
Сообщений: 4
По умолчанию

Нету вариантов?
Denis++ вне форума Ответить с цитированием
Старый 22.05.2014, 09:25   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

В смысле? Я ж уже вам говорил: у вас есть цикл от 1 до Н + есть м потоков, вот разбиваете [1;Н] на м промежутков, считаете все это в разных потоках, ждете, синхронизируете, получаете результат

ну или меняете алгоритм и там раскидываете на потоки
p51x вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Распараллеливание циклов. Amursk55 Visual C++ 0 30.09.2013 01:07
Алгоритмы и распараллеливание ChelliMandelli Помощь студентам 2 18.01.2013 00:50
Распараллеливание циклов с ипользованием OpenMP vitik Общие вопросы C/C++ 1 12.10.2012 06:49
Распараллеливание программы (C++) Lamaro Помощь студентам 5 04.10.2012 21:50
Распараллеливание процессов Zooleen Общие вопросы C/C++ 0 16.06.2010 16:59