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

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

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

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

11.04.2012, 21:41. Просмотров 832. Ответов 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...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.04.2012, 21:41     Проблемы с распараллеливанием(omp) простой программы
Посмотрите здесь:

C++ никто не сталкивался с распараллеливанием игры "Жизнь".
C++ Выполнение программы простой структуры
C++ Выполнение программы простой структуры
Разбор кода простой программы новичка C++
C++ Создание простой многопоточной программы
Оптимизация простой программы C++
Распараллеливание потоков для нахождения суммы матрицы <omp.h> C++
Распараллеливание через omp.h C++
C++ Компиляция простой MPI программы C++
C++ Почему не работает #pragma omp task?
C++ OMP parallel for
При компиляции простой программы - ошибки C++

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

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

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

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