Форум программистов, компьютерный форум CyberForum.ru

Распараллеливание цикла в MPI (0ая ветвь рассылает задание остальным ветвям, как только те освобождаются) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
assasian2
0 / 0 / 0
Регистрация: 11.11.2011
Сообщений: 3
15.03.2012, 13:53     Распараллеливание цикла в MPI (0ая ветвь рассылает задание остальным ветвям, как только те освобождаются) #1
Имеется примерно такой код (упрощённая запись).
Код
int size, rank;
int operations = 10000; //всего операций
int op_na_1_proc; // операций на каждый процессор
double x, y, z;

/**/MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);

op_na_1_proc = operations / size;

for (iter = op_na_1_proc*rank; iter < op_na_1_proc*(rank+1); iter++) {

	x = func1(iter);
		if (x>1.0) continue;
	y = func2(iter, x);
	z = func3(iter, y);

}
MPI_Reduce(&z, &min_Z, 1, MPI_DOUBLE, MPI_MIN, 0, MPI_COMM_WORLD);
/**/MPI_Finalize();
из-за условия "if (x>1.0) continue;" наблюдается сильный дисбаланс вычисления ветвей. Т.е. некоторые ветви заканчивают работу в

~2 раза быстрей чем остальные.
Мне необходимо от этого избавиться.


Придумал способ, чтобы сделать 0 процесс главным, и чтобы он (0) отсылал номер итерации (iter) освободившейся ветви. Однако застрял на реализации

Сделал следующее:
Код
/**/MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);


if (rank==0){
	for (rank_no = 1; rank_no < size; rank_no++) {
		if (MPI_Send(&iter, 1, MPI_INT, rank_no, 0, MPI_COMM_WORLD)==MPI_SUCCESS);
		MPI_Recv(&z,1, MPI_DOUBLE, rank_no, 1, MPI_COMM_WORLD, &Status);
		iter++;
}
else{
	MPI_Recv(&iter,1, MPI_INT, 0 /*откуда*/, 0, MPI_COMM_WORLD, &Status);

	x = func1(iter);
		if (x>1.0) continue;
	y = func2(iter, x);
	z = func3(iter, y);

	MPI_Send(&z, 1, MPI_DOUBLE, 0 /*куда*/, 1, MPI_COMM_WORLD
}
/**/MPI_Finalize();
В этом случае z будет посчитан всего 3 раза (iter=0,iter=1,iter=2).
Подскажите пожалуйста, как можно сделать так, чтобы считались все z (для iter = от 0 и до operations)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2012, 13:53     Распараллеливание цикла в MPI (0ая ветвь рассылает задание остальным ветвям, как только те освобождаются)
Посмотрите здесь:

Как выполнить распараллеливание с помощью OpenMP C++
вывод на экран чисел 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12, с использованием одного цикла и что бы все printf были только в теле цикла C++
Работа с OpenMP. Распараллеливание цикла for C++
Операторы цикла (задание должно быть выполнено всеми тремя типами циклов) C++
В бинарном дереве определить число узлов у которых есть указатель только на одну ветвь. C++
Определить число узлов в дереве, в которых есть указатель только на одну ветвь C++
C++ Задание на операторы цикла (подскажите, почему не выполняется программа)
C++ Придумайте, пожалуйста, задание с классами - только интересное

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 00:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru