Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2017, 00:37   #1
Anna_Vasilevskaya
Новичок
Джуниор
 
Регистрация: 22.12.2017
Сообщений: 1
По умолчанию Не правильно считает время выполнения программы

Задача заключалась в нахождении кротчайшего пути на графе методом Дейксты применяя параллельное программирование.
Результат нахождения путей верный, но время выдает не то.
при 6 потоках - 0,000526427
при 4 потоках - 0,000342600
при 2 потоках - 0,000289347
Где может быть ошибка?

Код:
#include <omp.h>
#include <stdio.h>
#include <cmath>
#include <iostream>
#include <limits.h>
#include <time.h>
using namespace std;
const int V = 6;
double t2;
double t1;
 
//алгоритм Дейкстры
void Deikstra(int graf[V][V], int st)
{
    int distance[V], count, index, i, u, m = st + 1;
    bool visited[V];
 
        for (i = 0; i < V; i++)
        {
            distance[i] = INT_MAX; visited[i] = false;
        }
 
        distance[st] = 0;
        t1 = omp_get_wtime();
        int nth = 2;
#pragma omp parallel for num_threads (nth)
        for (count = 0; count < V - 1; count++)
        {
            int min = INT_MAX;
            for (i = 0; i < V; i++)
                if (!visited[i] && distance[i] <= min)
                {
                    min = distance[i]; index = i;
                }
            u = index;
            visited[u] = true;
            for (i = 0; i < V; i++)
            {
                if (!visited[i] && graf[u][i] && distance[u] != INT_MAX &&
                    distance[u] + graf[u][i] < distance[i])
                    distance[i] = distance[u] + graf[u][i];
            }
        }
        
        t2 = omp_get_wtime();
        cout << "Затраченное время: ";
        cout << t2 - t1 << endl; //время выполнения
                cout << "Стоимость пути из начальной вершины до остальных: \t\n";
        for (i = 0; i < V; i++) if (distance[i] != INT_MAX)
            cout << m << " > " << i + 1 << " = " << distance[i] << endl;
        else cout << m << " > " << i + 1 << " = " << "маршрут недоступен" << endl;
 
}
//главная ф-ия
int main(void)
{
    setlocale(LC_ALL, "Rus");
    
    int start, graf[V][V] = {
        { 0, 6, 8, 1, 0, 0 },
        { 6, 0, 0, 0, 4, 3 },
        { 8, 0, 0, 5, 6, 0 },
        { 1, 0, 5, 0, 3, 0 },
        { 0, 4, 6, 3, 0, 1 },
        { 0, 3, 0, 0, 1, 0 } };
    cout << "Начальная вершина >> "; cin >> start;
    Deikstra(graf, start - 1);
    cin.get();
}
_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Serge_Bliznykov; 22.12.2017 в 10:45.
Anna_Vasilevskaya вне форума Ответить с цитированием
Старый 24.12.2017, 16:45   #2
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

Во-первых, считаешь ты время неправильно.
Такие мелкие задания надо прогонять много раз за время измерения, а потом брать средний расчёт.
Тут время выполнения намного меньше погрешности измерения.
Почитай вот это, например, тебе будет полезно.
https://habrahabr.ru/post/282301/

Во-вторых, на создание и синхронизацию потоков нужно время. И чем больше потоков, тем больше его нужно.
У тебя настолько маленький объём обрабатываемых данных, что эти расходы намного больше, чем расходы на сам поиск пути.
Собственно, из-за этого не надо пихать параллельные вычисления где ни попадя.

Попробуй сгенерировать граф из тысяч узлов и связей, тогда будет нужный эффект.

P.S. Это какой-то интересный синтаксис распараллелирования, я почти всегда пользуюсь std::thread.
Как я понимаю, этого нет в стандарте?
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Время выполнения программы! BlackFishSQL Паскаль, Turbo Pascal, PascalABC.NET 10 28.11.2011 23:48
Создание объектов во время выполнения программы Anubys C++ Builder 3 07.09.2011 21:07
Время выполнения программы. Небесный Паскаль, Turbo Pascal, PascalABC.NET 3 12.05.2011 09:39
Время выполнения программы Zhamie Общие вопросы Delphi 8 15.09.2009 15:26
Как замерить время выполнения программы Gracel Общие вопросы Delphi 5 12.06.2007 22:16