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

OpenMP: распараллеливание цикла

05.05.2019, 08:18. Показов 3955. Ответов 4

Author24 — интернет-сервис помощи студентам
Ниже представлена программа для численного интегрирования методом средних прямоугольников, распараллеленная с помощью OpenMP. Так вот вопрос, почему распараллелен внешний цикл, а не внутренний? С Си я знаком, а вот в OpenMP нуб.

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
#include <stdio.h>
#include <math.h>
#include <omp.h>
 
double func(double x)
{
    return exp(-x * x);
}
 
int main(int argc, char **argv)
{
    double t = omp_get_wtime();
    const double eps = 1E-6;
    const double a = -4.0;
    const double b = 4.0;
    const int n0 = 100000000;
    printf("Numerical integration: [%f, %f], n0 = %d, EPS = %f\n", a, b, n0, eps);
    double sq[2];
    #pragma omp parallel
    {
        int n = n0, k;
        double delta = 1;
        for (k = 0; delta > eps; n *= 2, k ^= 1) {
            double h = (b - a) / n;
            double s = 0.0;
            sq[k] = 0;
            // Ждем пока все потоки закончат обнуление sq[k]
            #pragma omp barrier
            #pragma omp for nowait
            for (int i = 0; i < n; i++)
                s += func(a + h * (i + 0.5));
            #pragma omp atomic
            sq[k] += s * h;
            // Ждем пока все потоки обновят sq[k]
            #pragma omp barrier
            if (n > n0)
                delta = fabs(sq[k] - sq[k ^ 1]) / 3.0;
            #if 0
                printf("n=%d i=%d sq=%.12f delta=%.12f\n", n, k, sq[k], delta);
            #endif
        }
 
        #pragma omp master
        printf("Result Pi: %.12f; Runge rule: EPS %e, n %d\n", sq[k] * sq[k], eps, n / 2);
    }
 
    t = omp_get_wtime() - t;
    printf("Elapsed time (sec.): %.6f\n", t);
 
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.05.2019, 08:18
Ответы с готовыми решениями:

OpenMP распараллеливание цикла
Привет кодеры! Нужна ваша помощь. У меня есть код который нужно распараллелить и тем самым получить...

Распараллеливание цикла For с использованием OpenMP
Всем привет. Задался целью изучить OpenMP, что бы в дальнейшем уметь распараллеливать программы....

Работа с OpenMP. Распараллеливание цикла for
Доброго времени суток товарищи. При работе с OpenMP возник следующий вопрос Почему код int i;...

Распараллеливание циклов в OpenMP
Доброго времени суток. Собственно в чем заключается вопрос: есть код, который заполняет трехмерный...

4
85 / 61 / 29
Регистрация: 15.05.2013
Сообщений: 188
05.05.2019, 17:14 2
я не специалист в openmp
Встречный вопрос: каково ожидание распараллеливания внутреннего цикла?
s -- изменяется последовательно во внешнем цикле
0
Evg
Эксперт CАвтор FAQ
21280 / 8303 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
05.05.2019, 21:35 3
Лучший ответ Сообщение было отмечено vlad_kostr как решение

Решение

На моей памяти, если ты хочешь распараллелить цикл, то перед ним (в твоём случае это внутренний цикл) надо воткнуть #pragma omp for

А сам по себе код, когда задан параллельный регион, а в нём неопознанный цикл - как-то смысла большого не имеет
1
0 / 0 / 0
Регистрация: 04.11.2017
Сообщений: 5
08.05.2019, 14:00  [ТС] 4
Мой вопрос не корректен. Перед внешним циклом активируется только параллельный регион, а распараллеливается внутренний цикл.

Добавлено через 2 минуты
shadowmaan, уменьшение времени работы программы
0
Evg
Эксперт CАвтор FAQ
21280 / 8303 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
08.05.2019, 15:08 5
Цитата Сообщение от vlad_kostr Посмотреть сообщение
shadowmaan, уменьшение времени работы программы
Внутренний цикл имеет зависимые итерации. Просто "#pragma omp for" тут скорее всего не будет дотаточно. Там требуется указание того, что результат накапливается в переменной "s" при помощи операции "+". Распараллеливание приведёт к изменившейся точности, т.е. результат будет отличаться от нераспараллеленного варианта. Поэтому, возможно, требуется какой-то отдельное указание, что афтор согласен на это

По мне так в этой программе "#pragma omp parallel" нужно применять только ко внутреннему циклу и больше ни к чему (т.е. все прочие "#pragma omp" на мой взгляд тут совершенно не к месту)
0
08.05.2019, 15:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.05.2019, 15:08
Помогаю со студенческими работами здесь

OpenMP распараллеливание вычислений
Выручите, перепробовал уже с бубном плясать не выходит. Матрицу создаю рандомно, элементов должно...

Распараллеливание с помощью OpenMP
Здравствуйте, уважаемые участники форума! Имеется цикл вида:for (i=1; i&lt;number; i++) { do...

Распараллеливание циклов с ипользованием OpenMP
Есть проблема , получился парадокс - время роботы программы с распараллеливанием дольше на 1 сек...

Распараллеливание циклов с использованием OpenMP C++
Доброго времени суток. (Нужен совет, так как разбираюсь с omp почти 3 дня и не хватает знанний) ...


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

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