Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.95
vitik
 Аватар для vitik
10 / 10 / 1
Регистрация: 05.01.2011
Сообщений: 152
#1

Распараллеливание циклов с ипользованием OpenMP - C++

11.10.2012, 12:00. Просмотров 2725. Ответов 3
Метки нет (Все метки)

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


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
#include <stdio.h>
#include <iostream>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
#include <omp.h>
using namespace std;
 
int main()
{
srand(time(NULL));
int heilth= 1000;
int width = 40;
double start_time,end_time,time;
int a[1000][40];
int i,j;
 
start_time = omp_get_wtime();
#pragma omp parallel for private(i,j)\
    shared (a)
 
for ( i = 0; i<heilth;++i)
{
    for( j=0; j<width; j++)
    {
        a[i][j] = 0+rand()%10 ;
        cout<<a[i][j]<<" ";
    }
    cout<<endl<<endl;
}
cout<<endl<<endl;
int sum =0;
int collNum = 0;
cout<<endl<<endl;
cout<<"--------Matrix  "<<heilth<<" x "<<width<<"--------"<<endl<<endl;
 
 
collNum = 0+rand()%width - 1;
 
for (int i = 1; i<heilth;i=i+2)
 
sum+= a[i][collNum];
 
 
cout<<endl<<"Sum of even numbers on the placement of elements "<<collNum<<" coll = "<<sum<<endl;
 
end_time = omp_get_wtime();
 
cout<<endl<<endl;
time=end_time-start_time;
 
cout <<"Time= "<<time;
 
getch();
 
 
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.10.2012, 12:00     Распараллеливание циклов с ипользованием OpenMP
Посмотрите здесь:

C++ Сортировка слов по алфавиту с ипользованием классов
Распараллеливание C++
Распараллеливание с помощью OpenMP C++
Как выполнить распараллеливание с помощью OpenMP C++
Распараллеливание алгоритмов C++
распараллеливание C++
Распараллеливание циклов C++
Распараллеливание вычислений C++
Работа с OpenMP. Распараллеливание цикла for C++
C++ Для распараллеливание процессов лучше пользоваться OpenMP или Win32?
C++ OpenIM - не работает распараллеливание циклов
Одновременная работу двух циклов openMP C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
astrogator
0 / 0 / 0
Регистрация: 12.12.2013
Сообщений: 2
27.02.2014, 22:55     Распараллеливание циклов с ипользованием OpenMP #2
У меня сейчас точно такая же проблема. Если нашли ее решение - обязательно напишите. Буду очень благодарен.
DU
1479 / 1055 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
27.02.2014, 23:27     Распараллеливание циклов с ипользованием OpenMP #3
все зависит от скорости операций, которые паралеллятся.
в вашем случае операции достаточно простые и больше времени тратится на
распаралелливание и управление тем, что происходит.
когда итерации цикла становятся тяжелее, то разница будет в пользу распаралелленного кода.
вот примерчик такой попробуйте у себя позапускать:
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <stdio.h>
#include <iostream>
#include <string>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
#include <math.h>
#include <omp.h>
 
using namespace std;
 
class TimeReport
{
  const std::string m_title;
  const double m_startTime;
 
public:
  TimeReport(const std::string& title)
    : m_title(title)
    , m_startTime(omp_get_wtime())
  {
  }
 
  ~TimeReport()
  {
    const double endTime = omp_get_wtime();
    std::cout << m_title << " : " << endTime - m_startTime << std::endl;
  }
 
private:
  TimeReport(const TimeReport&);
  TimeReport& operator = (const TimeReport&);
};
 
 
void LongFunction()
{
  const int iterations = 1000;
  for (int i = 0; i < iterations; ++i)
  {
    for (int j = 0; j < iterations / 10; ++j)
    {
      const double x = 1. / (i + 1);
      const double y = 1. / (j + i);
      const double z = (sin(x) * sin(y));
      if (z > 1000)
      {
        break;
      }
    }
  }
}
 
void ShortFunction()
{
  // just empty function
}
 
 
int main()
{
  const int iterations = 1000;
 
  {
    TimeReport timeReport("Long parallel ");
    #pragma omp parallel for
    for (int i = 0; i < iterations; ++i)
    {
      LongFunction();
    }
  }
 
  {
    TimeReport timeReport("Long serial   ");
    for (int i = 0; i < iterations; ++i)
    {
      LongFunction();
    }
  }
 
  {
    TimeReport timeReport("Short parallel");
    #pragma omp parallel for
    for (int i = 0; i < iterations; ++i)
    {
      ShortFunction();
    }
  }
 
  {
    TimeReport timeReport("Short serial  ");
    for (int i = 0; i < iterations; ++i)
    {
      ShortFunction();
    }
  }
 
  return 0;
}
у меня на одном из запусков выдает:
Long parallel : 1.50833
Long serial : 6.86634
Short parallel : 0.00240066
Short serial : 2.4542e-005

тут видно, что при длительной итерации параллельный вариант работает быстрее
mat_for_c
 Аватар для mat_for_c
120 / 115 / 21
Регистрация: 26.04.2013
Сообщений: 597
Завершенные тесты: 2
28.02.2014, 01:58     Распараллеливание циклов с ипользованием OpenMP #4
vitik, возможно все дело из-за rand(), т.к. он потоко небезопасен.

OpenMP. Время выполнения программы увеличивается с количеством потоков
Yandex
Объявления
28.02.2014, 01:58     Распараллеливание циклов с ипользованием OpenMP
Ответ Создать тему
Опции темы

Текущее время: 20:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru