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

Распараллелить метод Зейделя-Гаусса используя OpenMP

22.05.2018, 00:22. Показов 4295. Ответов 4
Метки нет (Все метки)

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
60
61
62
63
64
65
66
#include "stdafx.h"
#include "iostream"
#include "math.h"
#include "stdlib.h"
#include "locale.h"
#include "conio.h"
using namespace std;
const int n = 3;
bool converge(double*, double*, double);
int main()
{
        double start_time, end_time;
    start_time = omp_get_wtime();
setlocale(LC_ALL, "rus");
    double a[n][n] = { { 2.39, -0.46, 1.08 },
                { 0.54, 1.82, 0.73 },
                { 1.18, 0.52, 2.95 } };
    double b[n] = { 4.13, 2.42, 1.48 };
    double x[n] = { 0, 0, 0 };
    double p[n] = { 0, 0, 0 };
    double eps = 0.001;
    /*
    Ход метода, где:
    a[n][n] - Матрица коэффициентов
    b[n] - Столбец правых частей
    x[n], p[n] - Текущее и предыдущее решения
    */
    do
    {
        for (int i = 0; i < n; i++)
            p[i] = x[i];
 
        for (int i = 0; i < n; i++)
        {
            double var = 0;
            for (int j = 0; j < i; j++)
                var += (a[i][j] * x[j]);
            for (int j = i + 1; j < n; j++)
                var += (a[i][j] * p[j]);
            x[i] = (b[i] - var) / a[i][i];
        }
    } while (!converge(x, p, eps));
 
    //Выводим решения
    cout << "Решение: " << endl;
    for (int i = 0; i<n; i++)
        cout << "x" << i << ": " << x[i] << endl;
    cout << endl;
 
    end_time = omp_get_wtime();
    printf("Time %lf\n", end_time - start_time);
 
    _getch();
    return 0;
}
bool converge(double *xk, double *xkp, double eps)
{
    double norm = 0;
    for (int i = 0; i < n; i++)
    {
        norm += (xk[i] - xkp[i])*(xk[i] - xkp[i]);
    }
    if (sqrt(norm) >= eps)
        return false;
    return true;
}
Замеряю время: выходит примерно 0,034. Нужно применить распараллеливание, тем самым ускорить вычисления.

Подобное применение распараллеливания не принесло ускорения:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
do
    {
        for (int i = 0; i < n; i++)
            p[i] = x[i];
        for (int i = 0; i < n; i++)
        {
            double var = 0;
#pragma omp parallel for 
            for (int j = 0; j < i; j++)
                var += (a[i][j] * x[j]);
#pragma omp parallel for 
            for (int j = i + 1; j < n; j++)
                var += (a[i][j] * p[j]);
            x[i] = (b[i] - var) / a[i][i];
        }
    } while (!converge(x, p, eps));
Преподаватель посоветовал убрать зависимость по данным - как это сделать?
Буду признательна за советы и/или помощь)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.05.2018, 00:22
Ответы с готовыми решениями:

Распараллелить метод Гаусса (OpenMP)
Доброго времени суток, дамы и господа! Столкнулась с проблемой следующего рода - не получается...

Распараллелить, используя OpenMP
Имеется программа, для нахождения определенного интеграла. Необходимо ее распараллелить. Я сделал,...

Распараллелить цикл со сложной индексацией используя OpenMP
Пусть есть такой цикл, преобразующий массив: #define N 6 #define RADIUS 1 int arr; int...

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

4
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
22.05.2018, 11:32 2
Цитата Сообщение от мед Посмотреть сообщение
выходит примерно 0,034. Нужно применить распараллеливание, тем самым ускорить вычисления.
не думаю, что на таких результатах вы получите существенный выигрыш в скорости, если вообще получите. учтите время на создание потоков, тем более в цикле do ... while();
0
0 / 0 / 0
Регистрация: 08.12.2016
Сообщений: 7
23.05.2018, 19:28  [ТС] 3
А по поводу зависимости, вернее как убрать зависимость по данным в цикле?
0
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
24.05.2018, 14:11 4
Цитата Сообщение от мед Посмотреть сообщение
А по поводу зависимости, вернее как убрать зависимость по данным в цикле?
внутри циклов for нет этой зависимости. она появляется в do {...} while() - а как от нее избавиться - не представляю
0
0 / 0 / 0
Регистрация: 08.12.2016
Сообщений: 7
25.05.2018, 09:56  [ТС] 5
Спасибо)
0
25.05.2018, 09:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.05.2018, 09:56
Помогаю со студенческими работами здесь

СЛАУ. Метод обратной матрицы, метод Гаусса, метод Крамера, метод Зейделя
Помогите ребят. Не могу построить алгоритмы для этих методов Язык C++

Метод Зейделя-Гаусса С++
Для написания программы, решающей систему линейных уравнения методом итерации или Зейделя,...

Метод Гаусса-Зейделя
Здравствуйте. Задание дали нормальное такое) Вообще не понимаю что хотят. Объясните пожалуйста...

Метод Гаусса-Зейделя: неверный результат
Здравствуйте. Я вот написал(точнее фрагмент взял с Википедии) программу решения СЛАУ методом...


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

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