Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
4 / 4 / 1
Регистрация: 04.01.2017
Сообщений: 425
1

Параллельные вычисления с использованием параллельных секций в OpenMP

22.04.2018, 23:46. Просмотров 917. Ответов 5

Доброго времени суток, ребята!

Ребят, нужно вычислить интеграл на отрезке для функции. Нужно разбить вручную отрезок на несколько частей и запустить вычислений в параллельных регионах.

Вот что получилось написать. Но алгоритм не создаёт копии нужных переменных для каждого потока, хотя я это указываю в параметре (firstprivate (startTime,endTime)), не работает функция reduction (+:function). И вообще такое впечатление, что потоки для обозначенных мною секций не создаются.

Подскажите, что не верно написано?
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
double integralSektors(double a, double b, double steps) 
{
    int n = 3;
    double result = 0;
    double function = 0;
    double dx = (b-a) /steps;
    double startTime = 0, endTime = 0, time;
    omp_set_num_threads(n);
#pragma omp parallel sections firstprivate (startTime,endTime) reduction (+:function)
    {
#pragma omp section
        {
            startTime = omp_get_wtime();
            for (double i =a; i <(a-b)/3; i += dx)
            {
                function += log(i) - (3 * sin(3 * i));
            }
            endTime = omp_get_wtime();
            cout << "Time work: " << endTime - startTime << endl;
            cout <<"Number potok: "<<omp_get_thread_num()<<endl;
        }
#pragma omp section
        {
            startTime = omp_get_wtime();
            for (double i = (a-b)/3; i <((a - b) / 3)*2; i += dx)
            {
                function += log(i) - (3 * sin(3 * i));
            }
            endTime = omp_get_wtime();
            cout << "Time work: " << endTime - startTime << endl;
            cout << "Number potok: " << omp_get_thread_num() << endl;
        }
#pragma omp section
        {
            startTime = omp_get_wtime();
            for (double i = ((a - b) / 3) * 2; i <((a - b) / 3) * 3; i += dx)
            {
                function += log(i) - (3 * sin(3 * i));
            }
            endTime = omp_get_wtime();
            cout << "Time work: " << endTime - startTime << endl;
            cout << "Number potok: " << omp_get_thread_num() << endl;
        }
    }
    result = function * dx;
    return result;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.04.2018, 23:46
Ответы с готовыми решениями:

Параллельные вычисления: произведение двух векторов (OpenMP)
Помогите с написанием программы вычисления произведения двух векторов с использованием...

Перевести программу с паскаля на фортран, используя Параллельные вычисления и OpenMP
Есть несложная программа на паскале, надо ее перевести в фортран с помощью параллельных вычислений...

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

Параллельные сортировки с OpenMP
Привет, читателю . Надеюсь не поленитесь прочесь до конца, кто понимает =) Вообщем суть такова, у...

5
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 971
23.04.2018, 10:14 2
Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
И вообще такое впечатление, что потоки для обозначенных мною секций не создаются.
в настройках компилятора опцию /openmp выставляли? без нее не будет работать

Добавлено через 12 минут
во всех циклах
C++
1
for (double i =a; i <(a-b)/3; i += dx)
исправьте на (b-a)
1
4 / 4 / 1
Регистрация: 04.01.2017
Сообщений: 425
23.04.2018, 14:14  [ТС] 3
Цитата Сообщение от mat_for_c Посмотреть сообщение
в настройках компилятора опцию /openmp выставляли? без нее не будет работать
Да, включена, я тестировал с одной секцией - работало, выводило время работы потока и номе потока.

Цитата Сообщение от mat_for_c Посмотреть сообщение
во всех циклах
C++Выделить код
1
for (double i =a; i <(a-b)/3; i += dx)
исправьте на (b-a)
Да это косяк, исправил. Но впечатление, что работает только одна секция. На принтСкрине результаты работы.
0
Миниатюры
Параллельные вычисления с использованием параллельных секций в OpenMP  
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 971
23.04.2018, 17:17 4
Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
Но впечатление, что работает только одна секция. На принтСкрине результаты работы.
не думаю. просто задача у вас маленькая, потоки не успевают создаться.

я немного переписал вывод разве что:
Кликните здесь для просмотра всего текста
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
#define NMAX 1000
 
#include<iostream>
#include<cmath>
#include<omp.h>
 
using namespace std;
 
double integralSektors(double a, double b, double steps)
{
   int n = 3;
   double result = 0;
   double function = 0;
   double dx = (b - a) / steps;
   double startTime = 0, endTime = 0, time;
   omp_set_num_threads(n);
#pragma omp parallel sections firstprivate (startTime,endTime) reduction (+:function)
   {
#pragma omp section
         {
            startTime = omp_get_wtime();
            for (double i = a; i < (b - a) / 3; i += dx)
            {
               function += log(i) - (3 * sin(3 * i));
            }
            endTime = omp_get_wtime();
            printf("Time work: %f\nNumber potok: %d\n", endTime - startTime, omp_get_thread_num());
         }
#pragma omp section
         {
            startTime = omp_get_wtime();
            for (double i = (b - a) / 3; i < ((b - a) / 3) * 2; i += dx)
            {
               function += log(i) - (3 * sin(3 * i));
            }
            endTime = omp_get_wtime();
 
            printf("Time work: %f\nNumber potok: %d\n", endTime - startTime, omp_get_thread_num());
         }
#pragma omp section
         {
            startTime = omp_get_wtime();
            for (double i = ((b - a) / 3) * 2; i < ((b - a) / 3) * 3; i += dx)
            {
               function += log(i) - (3 * sin(3 * i));
            }
            endTime = omp_get_wtime();
 
            printf("Time work: %f\nNumber potok: %d\n", endTime - startTime, omp_get_thread_num());
         }
   }
   result = function * dx;
   return result;
}
 
int main() {
   std::cout << integralSektors(10, 20, 2000);
 
   system("pause");
   return 0;
}
1
Миниатюры
Параллельные вычисления с использованием параллельных секций в OpenMP  
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 971
23.04.2018, 17:20 5
простите за картинку

Добавлено через 1 минуту
Vlad__i__mir, введите 1, 100, 100000. должно сработать
0
4 / 4 / 1
Регистрация: 04.01.2017
Сообщений: 425
24.04.2018, 21:44  [ТС] 6
Цитата Сообщение от mat_for_c Посмотреть сообщение
введите 1, 100, 100000. должно сработать
Спасибо! Заработало!

Ещё поправил разбиение и даже считать верно стал )
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.04.2018, 21:44

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

OpenMP. Вызов функции в параллельных циклах
Здравствуйте! Помогите, пожалуйста, разобраться, каким образом можно заставить корректно работать...

Параллельные вычисления
Здравствуйте! Нужно перебрать целые числа от M до N и найти первое попавшееся число, подходящее под...

Параллельные вычисления
Имеется код, который проверяет число j на простоту: using System; using...

Параллельные вычисления
Прошу помочь решить следующую задачу(параллельное программирование) Дана последовательность чисел....

Параллельные вычисления
Здравствуйте. Пишу курсовую,пришлось много что узнавать нового,так как параллельное...

Параллельные вычисления
Здравствуйте, не знаю в какой ветке постить, решил в этой. Хочу использовать эти технологии...


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

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

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