Форум программистов, компьютерный форум, киберфорум
OpenMP
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
2 / 2 / 0
Регистрация: 04.03.2012
Сообщений: 52
1

OpenMP, не создаются потоки

21.03.2015, 00:02. Показов 2636. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет всем.
Подскажите пожалуйста по такой штуке: делаю задачу "Производители-потребители", начал проверять что хотя б создаётся заданное количество потоков, но этого не происходит. Вот код:

Кликните здесь для просмотра всего текста
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
#include <omp.h>
#include <iostream>
#include <windows.h> // Для Sleep()
#include <string>
 
#define MAX 5 // размер массива для хранения информации от Производителей
 
using namespace std;
 
void producer(int prod){
    int n = 0;
    omp_set_dynamic(0);
#pragma omp parallel num_threads (prod) private(n)
    {
        int a = 0;
        a+=1;
        while (true){
            cout << "Сгенерировано сообщение номер "<< n << " от Производителя номер " << omp_get_thread_num() << endl;
            n+=1;
            Sleep(1000);
        }
    }
}
 
void consumer(int cons){
    omp_set_dynamic(0);
#pragma omp parallel num_threads (cons)
    {
        while (true){
            cout << "Получено сообщение из массива данных Потребителем номер " << omp_get_thread_num() << endl;
            Sleep(2000);
        }
    }
}
 
int main() {
    setlocale(LC_ALL,"Russian");
    int prod,cons;
 
    cout << "Введите количество Производителей:";
    cin >> prod;
    cout << "Введите количество Потребителей:";
    cin >> cons;
    cout << "              Моделирование началось:" << endl;
    
    #pragma omp parallel sections num_threads(2) 
        {
                #pragma omp section
                    {
                        producer(prod);
                    }
                #pragma omp section
                    {
                        consumer(cons);
                    }
        }
 
    getchar();
}


Что я делаю не так?
По выводу в консоли получается, что создаётся всё время по 1-му потоку, а не столько, сколько задаю при запуске программы:
Кликните здесь для просмотра всего текста
Программа для моделирования задачи
Производители-Потребители.
=====================================================

Введите количество Производителей:3
Введите количество Потребителей:3
=====================================================

Моделирование началось:
Сгенерировано сообщение номер Получено сообщение из массива данных Потребителем
номер 00 от Производителя номер
0
Сгенерировано сообщение номер 1 от Производителя номер 0
Получено сообщение из массива данных Потребителем номер Сгенерировано сообщение
номер 02
от Производителя номер 0
Сгенерировано сообщение номер 3 от Производителя номер 0
Получено сообщение из массива данных Потребителем номер Сгенерировано сообщение
номер 04
от Производителя номер 0
Сгенерировано сообщение номер 5 от Производителя номер 0
Получено сообщение из массива данных Потребителем номер 0
Сгенерировано сообщение номер 6 от Производителя номер 0
Сгенерировано сообщение номер 7 от Производителя номер 0
Получено сообщение из массива данных Потребителем номер 0
Сгенерировано сообщение номер 8 от Производителя номер 0
Сгенерировано сообщение номер 9 от Производителя номер 0
Получено сообщение из массива данных Потребителем номер 0
Сгенерировано сообщение номер 10 от Производителя номер 0
Сгенерировано сообщение номер 11 от Производителя номер 0
Получено сообщение из массива данных Потребителем номер 0
Сгенерировано сообщение номер 12 от Производителя номер 0
Сгенерировано сообщение номер 13 от Производителя номер 0
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.03.2015, 00:02
Ответы с готовыми решениями:

OPENmp параллельные потоки QT
#include &lt;iostream&gt; #include &quot;omp.h&quot; using namespace std; int main() { #pragma omp...

Не создаются новые потоки при распараллеливании цикла for (работает только один поток - главный)
Доброго времени суток, ребята! Пишу код по распараллеливанию умножения матриц. Всё вроде...

OpenMP. Время выполнения программы больше чем без OpenMP
Сегодня первый раз сел за OpenMP. Читаю на сайте майкрософта как работает этот API. Так вот там...

Не создаются потоки
Доброго времени суток! Пытаюсь создать массив потоков: HANDLE Threads; for(int i=0; i &lt; 3;...

6
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
21.03.2015, 00:49 2
В опциях компилятора включали openmp?
1
2 / 2 / 0
Регистрация: 04.03.2012
Сообщений: 52
21.03.2015, 09:30  [ТС] 3
Да, включён. В других лабах всё выполняется нормально, даже в этом же коде создаются потоки если написать в main() что-нибудь вроде

C++
1
2
#pragma omp parallel num_threads(5)
cout << "test " << endl;
печатается test test test test test

а так как именно написано - выводит то, что в спойлере. И это всё запускается в VMWare, в которой указано 2 процессора.

Добавлено через 58 минут
Вот еще прочитал про omp_set_nested(), попробую с ней.

Добавлено через 3 минуты
Это же вложенный параллелизм получается, может в XP- VMware проблемы с этим.

Добавлено через 1 час 8 минут
Да, нужно было ставить omp_set_nested(1);

В методичке написано: "Параллельные области могут быть вложенными; по умолчанию вложенная
параллельная область выполняется одной нитью."

Вопрос решён!
0
0 / 0 / 0
Регистрация: 03.12.2016
Сообщений: 5
10.05.2017, 15:54 4
можешь скинуть готовую программу? и где используется MAX?
0
2 / 2 / 0
Регистрация: 04.03.2012
Сообщений: 52
10.05.2017, 20:18  [ТС] 5
Вот, за правильность ручаться не буду
Кликните здесь для просмотра всего текста
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <omp.h>
#include <iostream>
#include <windows.h> // Для Sleep()
#include <string>
 
#define MAX 5 // Размер массива для хранения поступающей информации от Производителей
int flag = 0; // Текущая позиция для считывания/записи данных
int MESSAGE = 0; // Целые числа, передаваемые от Производителей Потребителям
omp_lock_t lock; // Замок для синхронизации доступа к общим данным
 
using namespace std;
 
void producer(int *myArray){
        while (true){
            //omp_set_lock(&lock);
            // пробую неблокирующий захват замка
            while (!omp_test_lock(&lock));
            if (flag <= MAX -1) { 
                myArray[flag*MAX+0] = MESSAGE;
                myArray[flag*MAX+1] = omp_get_thread_num();
                cout << "Записано сообщение номер "<< MESSAGE << " от Производителя номер " << omp_get_thread_num() << endl;
                flag+=1;
                MESSAGE+=1; // Генерируется сообщение
            }
            omp_unset_lock(&lock);
        }
}
 
void consumer(int *myArray){
        while (true){
            //omp_set_lock(&lock);
            // пробую неблокирующий захват замка
            while (!omp_test_lock(&lock));
            if (flag > 0){ // Только когда уже есть данные в массиве
                cout << "Получено сообщение номер "<<myArray[(flag-1)*MAX+0]<< " из массива данных от Производителя "<<myArray[(flag-1)*MAX+1]<< " Потребителем номер " << omp_get_thread_num() << endl;
                myArray[(flag-1)*MAX+0] = 0;
                myArray[(flag-1)*MAX+1] = 0;
                flag -= 1 ;
            }
            omp_unset_lock(&lock);          
        }
}
 
int main() {
    setlocale(LC_ALL,"Russian");
    int prod,cons;
    int *myArray = new int[MAX * 2]; // Для хранения номера сообщения и номера потока-Производителя
    
    for (int i = 0; i < MAX; i++)   // Обнуляем массив
        for (int j = 0; j < 2; j++)
            myArray[i*2 + j] = 0;
    
    cout << "        Программа для моделирования задачи" << endl;
    cout << "            Производители-Потребители."<<endl;
    cout << "=====================================================" <<endl <<endl;
    cout << "Введите количество Производителей:";
    cin >> prod;
    cout << "Введите количество Потребителей:";
    cin >> cons;
 
    cout << "=====================================================" <<endl <<endl;
    cout << "              Моделирование началось:" << endl;
 
    omp_set_dynamic(0); // Запрещаем системе динамически менять количество нитей
    omp_set_nested(1); // Разрешаем вложенный параллелизм
    omp_init_lock(&lock); // Инициализация замка
    #pragma omp parallel sections num_threads(2) 
        {
                #pragma omp section
                    {
                        #pragma omp parallel num_threads (prod) shared (flag,MESSAGE,myArray)
                        producer(myArray);
                    }
                #pragma omp section
                    {
                        #pragma omp parallel num_threads (cons) shared (flag,MESSAGE,myArray)
                        consumer(myArray);
                    }
        }
        omp_destroy_lock(&lock);
    getchar();
}
0
0 / 0 / 0
Регистрация: 03.12.2016
Сообщений: 5
10.05.2017, 20:33 6
Запускаю программу, подключаю omp и дальше этого вообще не идёт, подскажешь, что может быть?
Миниатюры
OpenMP, не создаются потоки  
0
2 / 2 / 0
Регистрация: 04.03.2012
Сообщений: 52
10.05.2017, 20:38  [ТС] 7
Могу помочь только исходником, я Си не занимался после этого.
0
10.05.2017, 20:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.05.2017, 20:38
Помогаю со студенческими работами здесь

Не создаются все потоки
my @threads; my @links = ( 'http://mail.ru', 'http://gmail.com', 'http://hotmail.com',...

Потоки в VB.NET создаются но не работают
Dim ThreadList As New Generic.List(Of Threading.Thread) For Each x In list ...

Создаются не все потоки (пул потоков)
Создаю потоки: for (int i = 0; i &lt; Convert.ToInt32(countPool.Text); i++) { ...

Что за потоки и где они создаются?
Я не могу понять откуда берутся два потока. Я запускаю программу на выполнение, при старте там...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru