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

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

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

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

15.03.2012, 13:53. Просмотров 1476. Ответов 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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2012, 13:53     Распараллеливание цикла в MPI (0ая ветвь рассылает задание остальным ветвям, как только те освобождаются)
Посмотрите здесь:
Работа с OpenMP. Распараллеливание цикла for C++
Определить число узлов в дереве, в которых есть указатель только на одну ветвь C++
В бинарном дереве определить число узлов у которых есть указатель только на одну ветвь. C++
Как в АВЛ-дереве найти самую короткую ветвь и удалить ее? C++
C++ Задание на операторы цикла (подскажите, почему не выполняется программа)
Операторы цикла (задание должно быть выполнено всеми тремя типами циклов) C++
Как выполнить распараллеливание с помощью OpenMP C++
C++ Вывести полуокружности, повторяя по два раза с каждой стороны до конца цикла (графическое задание)
C++ Придумайте, пожалуйста, задание с классами - только интересное
[MPI] Как отправить кусок матрицы nxm C++
C++ Прибавить первый столбец матрицы ко всем остальным столбцам
C++ Запуск программ mpi. Как посмотреть результат работы?

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

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

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