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

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

Войти
Регистрация
Восстановить пароль
 
Den4ik
0 / 0 / 0
Регистрация: 24.08.2011
Сообщений: 42
#1

Проблемы с распараллеливанием(omp) простой программы - C++

11.04.2012, 21:41. Просмотров 890. Ответов 5
Метки нет (Все метки)

Нужно реализовать и распараллелить простенький алгоритм: Найти минимальное число, большее заданного N, которое делится нацело на все заданные числа n1, n2, ... nk.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <iostream>
#include <ctime>
#include <omp.h>
#include <vector>
#include <list>
using namespace std;
 
void main(){
    setlocale(LC_ALL,"Russian");
 
    int N, M;
    int k = 0;
    
    cout << "Введите N >> ";
    cin >> N;
    cout << "Введите колличиество чисел k >> ";
    cin >> k;
    vector<int> Vector(0);// вектор в котором будут храниться n1, n2, ... nk
    list<int> Suit; // список с числами > N делящиеся нацело на n1, n2, ... nk
 
    for(int i = 0; i < k; i++){
        int n;
        cout << "Введите "<<i+1<<"е число >>";
        cin >> n;
        Vector.push_back(n);
    }
 
    long c = 0;
    c = clock();
        
    #pragma omp parallel 
    cout <<omp_get_thread_num()<<endl;
    #pragma omp parallel for default(none) shared(N, k, Vector, Suit) 
    for(int i = 0 ; i < 1000000; i++){
        N++;
        bool t = true;
        for(int j = 0; j < k; j++){
            if( N%Vector[j]!=0 ){
                t=t&&false;
            }
        }
        if(t){ 
#pragma omp critical
            
            Suit.push_back(N);
        }   
    }
        
    list<int>::iterator it = Suit.begin();
    
        // ищем наименьшее из подходящих
        M = *it;
    for(; it != Suit.end(); it++){
        if(*it < M){
            M = *it; 
        }
    }
    
    cout<<"Наименьшее число >>> "<< M <<endl;
    cout << "Время выполнения: " << clock() - c << "\n";
 
    system("pause");
 
}
Все работает, но с распараллеливанием никак. Мои идеи закончились на #pragma omp critical...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2012, 21:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Проблемы с распараллеливанием(omp) простой программы (C++):

С++ с распараллеливанием MPI - C++
Добрый день! Мне очень нужна ваша помощь. Задали написать программу &quot;Метод трапеций для вычисления определенного интеграла&quot;. Сложность в...

OMP parallel for - C++
#pragma omp parallel for for (int j = 0; j &lt; whatFind.size(); j++) { string temp = &quot;&quot;; int t = Find(whatFind, 0,...

Распараллеливание через omp.h - C++
// labaOMP.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;omp.h&gt; ...

Почему не работает #pragma omp task? - C++
Сижу быструю сортировку распараллеливаю. Использую подручные средства, а именно Visual Studio 2013 Ultimate. Программа никак не хочет...

Оптимизация простой программы - C++
Суть задачи такова: программа должна вычислить сумму цифр которые делятся на a или b и цифры должны быть меньше n. Максимальное число n =...

Создание простой многопоточной программы - C++
Здравствуйте спецы. Никак не могу разобраться с многопоточностью. Помогите на простом примере разобраться с этим. ...

5
zss
Модератор
Эксперт С++
6579 / 6141 / 2023
Регистрация: 18.12.2011
Сообщений: 16,004
Завершенные тесты: 1
11.04.2012, 21:51 #2
Распараллелить можно по делению на n1...nk,
т.е. найти отдельно мин числа, делящееся на n1,n2,...,nk.
А потом выбрать из них наименьшее одинаковое.
0
Den4ik
0 / 0 / 0
Регистрация: 24.08.2011
Сообщений: 42
11.04.2012, 22:14  [ТС] #3
Не совсем понял....
И в чем у меня ошибка?

Добавлено через 18 минут
Как я понял с omp переменная t не корректно принимает значения true/false.
Пытался сделать так: #pragma omp parallel for default(none) private(t) shared(N, k, Vector, Suit)
не помогло.
0
zss
Модератор
Эксперт С++
6579 / 6141 / 2023
Регистрация: 18.12.2011
Сообщений: 16,004
Завершенные тесты: 1
12.04.2012, 07:26 #4
В первую очередь завести отдельные массивы для делимых на каждое из n1,n2,...
а циклы строк 34 и 37 поменять местами.
А потом уже вне этих циклов перебрать получившиеся массивы.
0
Den4ik
0 / 0 / 0
Регистрация: 24.08.2011
Сообщений: 42
13.04.2012, 14:34  [ТС] #5
Цитата Сообщение от zss Посмотреть сообщение
В первую очередь завести отдельные массивы для делимых на каждое из n1,n2,...
а циклы строк 34 и 37 поменять местами.
А потом уже вне этих циклов перебрать получившиеся массивы.
можешь объяснить почему именно так нужно сделать и как такой подход влияет на распараллеливание?
0
zss
Модератор
Эксперт С++
6579 / 6141 / 2023
Регистрация: 18.12.2011
Сообщений: 16,004
Завершенные тесты: 1
14.04.2012, 14:31 #6
В каждом из параллельных процессов вычисления должны вестись независимо друг от друга,
а по окончании процессов результаты можно объединить.
Вот поэтому я и предлагаю посчитать независимо делимые для каждого из ni,
а потом результаты объединить.
0
14.04.2012, 14:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.04.2012, 14:31
Привет! Вот еще темы с ответами:

Выполнение программы простой структуры - C++
Для задачи записать выражение, зависящее от координат точки X1 и Y1 и принимающее значение TRUE, если точка принадлежит заштрихованной...

Выполнение программы простой структуры - C++
1. Для задачи 1 определить тип заданных выражений и найти их значения. 2. Составить систему тестов и вычислить полученное выражение для...

C++ Компиляция простой MPI программы - C++
Доброго вечера, в DevC++ 5.4.2 с использованием технологии MPI, MPICH2 (Настройка компилятора MinGW GCC 4.7.2 32-bit) пытаюсь запустить...

никто не сталкивался с распараллеливанием игры "Жизнь". - C++
Всем приветики=**** Ребята, очень хотелось поинтересоваться, никто не сталкивался с распараллеливанием игры &quot;Жизнь&quot;. Очень прям нужно,...


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

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

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