Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
assasian2
0 / 0 / 0
Регистрация: 11.11.2011
Сообщений: 3
#1

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

15.03.2012, 13:53. Просмотров 1566. Ответов 0
Метки нет (Все метки)

Имеется примерно такой код (упрощённая запись).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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) освободившейся ветви. Однако застрял на реализации

Сделал следующее:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/**/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)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2012, 13:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Распараллеливание цикла в MPI (0ая ветвь рассылает задание остальным ветвям, как только те освобождаются) (C++):

Парсинг лог файла и распараллеливание используя mpi - C#
собственно, есть лог-файлы вида Нужно сортировать по дате, выводить собственно саму дату, пользователя, время работы. Погуглив,...

Распараллеливание цикла while - C#
Здравствуйте, дорогие форумчани! Мучаюсь над проблемой распараллеливания while:gsad: Пишу bbs генератор, а он, как известно, очень...

Распараллеливание цикла - C#
for (int i = 0; i &lt; 30; i++) { db.cdb.RefreshConnection(); res...

OpenMP распараллеливание цикла - C++
Привет кодеры! Нужна ваша помощь. У меня есть код который нужно распараллелить и тем самым получить выигрыш по времени выполнения. Для...

Работа с OpenMP. Распараллеливание цикла for - C++
Доброго времени суток товарищи. При работе с OpenMP возник следующий вопрос Почему код int i; int Mass={0}; ...

Бинарное дерево - Просмотр дерева в следующем порядке: узел, левая ветвь, правая ветвь - Pascal ABC
3. Разработать программу работы с бинарным деревом. Программа должна содержать следующие процедуры, вызываемые из меню: - построение...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.03.2012, 13:53
Привет! Вот еще темы с ответами:

Сервер Чата не отсылает сообщение всем остальным, а только назад отправителю - Java Сети
Если быть короче, то сервер должен работать просто: получает сообщение от клиента, это же сообщение отправляет всем подключённым клиентам,...

Определить число узлов в дереве, в которых есть указатель только на одну ветвь - C++
Люди добрый помогите ,пожалуйста, нужно определить число узлов в дереве, в которых есть указатель только на одну ветвь. Мой код дерева: ...

В бинарном дереве определить число узлов у которых есть указатель только на одну ветвь. - C++
Помогите плз. Нужен код на определение числа узлов у которых есть указатель только на одну ветвь. код дерева #include&lt;iostream.h&gt; ...

Выполните, пожалуйста, задание, при этом вместо оператора цикла while используйте оператора цикла do_while - C++
Используя оператор цикла while, напишите программу для вычисления ниже следующей суммы. // fkdj.cpp: определяет точку входа...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru