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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Перевести код с Паскаля на С++ http://www.cyberforum.ru/cpp-beginners/thread519332.html
Фирме принадлежат два магазина. Известна стоимость товаров, проданных в каждом магазине за каждый день в июле и августе, которая хранится в двух массивах. Получить общую стоимость проданных фирмой товаров за два месяца. program turner; uses crt; var a: array of integer; b: array of integer; i, s, s1: integer; begin clrscr; Randomize; for i := 1 to 30 do begin
C++ C++ Поиск пикселя заданного цвета и замена другим. Ребята, помогите пожалуйста с решением задачи. Кучу документации перекопала - никак не могу найти решение. Нужно разработать программу, которая: в заданной области находит точки зеленого цвета, используя режим чтения 0, и заменяет их на красные, используя режим записи 2. ЗАрание всем спасибо. http://www.cyberforum.ru/cpp-beginners/thread519330.html
C++ Вопрос по символьным массивам
Задание: с клавиатуры в символьный одномерный массив вводится название типа. С помощью оператора switch нужно вывести sizeof(тип). Можно ли каким то образом сделать так, чтобы case обрабатывал строку, и возможно ли вообще работать с целой строкой?
C++ Квадратное уравнение
Все здраствуйте))Изучаю С++ второй день)решил написать программу для решения корней квадратного уравнения вида A*x^2+b*x+C=0. Все вроде работает, корни находит.Но потом я нашел один баг , когда вводишь A=0,B=0,а C-любое неравное нулю, программа все равно выводит значения. Но исправить его у меня не получается, ниже привожу свой код.Помоги понять в чем глюк чайнику)) #include<iostream>...
C++ Переставить местами первый минимальный и первый максимальный элементы массива из n вещественных чисел http://www.cyberforum.ru/cpp-beginners/thread519308.html
Ребят нужен код, плизз )
C++ Слова текста из малых латинских букв записаны не менее чем через один пробел Слова текста из малых латинских букв записаны не менее чем через один пробел; текст оканчивается точкой. Без использования конструкции String: а) Написать программу ввода такого текста с клавиатуры; б) Напечатать все слова, отличающиеся от последнего слова, перед печатью перенеся первую букву в конец слова. Надеюсь на вашу помощь, Благодарю. подробнее

Показать сообщение отдельно
assasian2
0 / 0 / 0
Регистрация: 11.11.2011
Сообщений: 3

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

15.03.2012, 13:53. Просмотров 1478. Ответов 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)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru