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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.03.2012, 13:41   #1
Quew
Новичок
Джуниор
 
Регистрация: 02.02.2012
Сообщений: 2
Восклицание Распараллеливание цикла в MPI

Имеется примерно такой код (упрощённая запись).
Код:
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)
Quew вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Распараллеливание процессов Walanter Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 05.03.2012 22:02
Распараллеливание кусочка кода на Си (MPI && openMP) Quew Общие вопросы C/C++ 0 02.02.2012 19:38
Потоки. Распараллеливание вычислений. Я спрошу? Помощь студентам 0 23.12.2011 21:07
Распараллеливание процессов Zooleen Общие вопросы C/C++ 0 16.06.2010 16:59
Распараллеливание потока eXa Общие вопросы Delphi 3 19.07.2007 20:11