Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
37 / 32 / 12
Регистрация: 31.05.2012
Сообщений: 586
1

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

13.04.2017, 10:18. Показов 3481. Ответов 5
Метки нет (Все метки)

Привет кодеры! Нужна ваша помощь. У меня есть код который нужно распараллелить и тем самым получить выигрыш по времени выполнения. Для распараллеливания нужно использовать библиотеку OpenMP. Я конечно почитал статейку о том как работать с данной библиотекой и сделал попытки, которые не увенчались успехом. Я решил добавить "#pragma omp parallel for " чтобы цикл паралеллился, но в результате программа еще дольше выполняется. Прошу вас помочь мне в этом легком деле на которое мои куриные мозги не способны


вот кусок кода:

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
void algorithms::optimization_matrix_multiplication_CRS(CRS &crs_a, CRS &crs_b, int n)
{
 
        double sum=0.0;
 
 
        for(int i=0; i<n; i++)
        {
 
            #pragma omp parallel for  //здесь моя жалкая попытка
            for(int j=0; j<n; j++)
            {
             
                sum=0.0;
    
         int ks = crs_a.row[i];  int ls = crs_b.row[j];
 
         int kf = crs_a.row[i+1]-1;  int lf = crs_b.row[j+1]-1;
 
         while( (ks<=kf) && (ls<=lf))
         {
 
              if(crs_a.coordinate[ks].col < crs_b.coordinate[ls].col)
                  ks++;
              else
                  if(crs_a.coordinate[ks].col > crs_b.coordinate[ls].col)
                  ls++;
              else
                  {
                     sum+=crs_a.coordinate[ks].value * crs_b.coordinate[ls].value;
                      ks++;
                      ls++;
                  }
 
 
              }
 
            }
 
        }
 
}

Так же критикуйте и унижайте за кривой код....всегда рад критике
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.04.2017, 10:18
Ответы с готовыми решениями:

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

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

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

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

5
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
13.04.2017, 22:21 2
Цитата Сообщение от Левиафам Посмотреть сообщение
//здесь моя жалкая попытка
каждую итерацию внешнего цикла у вас будут создаваться и удаляться потоки, а на это уходит время. гдядя на приведённый код, тогда распараллеливать внешний цикл через #prgma omp parallel for.
хотя мне не очень понятно, что конкретно делает функция (не возвращает результат и не изменяет входные параметры, в добавок sum = 0.0 каждую итерацию внутреннего цикла по j).
1
37 / 32 / 12
Регистрация: 31.05.2012
Сообщений: 586
14.04.2017, 13:40  [ТС] 3
mat_for_c,
Цитата Сообщение от mat_for_c Посмотреть сообщение
а на это уходит время
спасибо за замечание. Я просто к двум циклам добавил эти директивы и у меня действительно время сократилось, но не на столько, чтобы было быстрее если бы директив не было бы вообще (то есть в 1 поток)

тут сложно объяснять что делает функция и долго, да и не нужно думаю. Главное то, что нужно метод распараллелить и получить выигрыш по времени выполнения.
0
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
14.04.2017, 16:57 4
Цитата Сообщение от Левиафам Посмотреть сообщение
Я просто к двум циклам добавил эти директивы
Цитата Сообщение от Левиафам Посмотреть сообщение
и получить выигрыш по времени выполнения
используйте директиву только для внешнего цикла.
0
37 / 32 / 12
Регистрация: 31.05.2012
Сообщений: 586
16.04.2017, 20:32  [ТС] 5
mat_for_c, не смогу получить выигрыш по времени

делал так:

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
void algorithms::optimization_matrix_multiplication_CRS(CRS &crs_a, CRS &crs_b, int n)
{
 
        double sum=0.0;
 
 #pragma omp parallel for
        for(int i=0; i<n; i++)
        {
 
            
            for(int j=0; j<n; j++)
            {
             
                sum=0.0;
    
         int ks = crs_a.row[i];  int ls = crs_b.row[j];
 
         int kf = crs_a.row[i+1]-1;  int lf = crs_b.row[j+1]-1;
 
         while( (ks<=kf) && (ls<=lf))
         {
 
              if(crs_a.coordinate[ks].col < crs_b.coordinate[ls].col)
                  ks++;
              else
                  if(crs_a.coordinate[ks].col > crs_b.coordinate[ls].col)
                  ls++;
              else
                  {
                     sum+=crs_a.coordinate[ks].value * crs_b.coordinate[ls].value;
                      ks++;
                      ls++;
                  }
 
 
              }
 
            }
 
        }
 
}
0
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
22.04.2017, 09:34 6
Цитата Сообщение от Левиафам Посмотреть сообщение
не смогу получить выигрыш по времени
Возможно проблема связяна вот с чем. По умолчанию, все переменные, используемые в параллельных областях OpenMP, являются приватными (директива private(список переменных)). Тем самым, если имеются переменные определённые до параллельной области, создаются локальные копии этих переменных для каждого потока. Предполагаю, что копирование crs_a и crs_b весьма затратно. Попробуйте написать так: #pragma omp parallel for shared(crs_a, crs_b)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.04.2017, 09:34

Помощь в написании контрольных, курсовых и дипломных работ здесь.

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

Как выполнить распараллеливание с помощью OpenMP
Доброго дня. У меня есть две функции. void A(const vector &lt;double&gt; &amp;a){ //что-то считаем c...

Распараллеливание вычисления интеграла используя редукции (OpenMP)
Доброго времени суток, ребята! Ксть задача распараллелить процесс вычисления интеграла методом...

Для распараллеливание процессов лучше пользоваться OpenMP или Win32?
Для распараллеливание процессов лучше пользоваться OpenMP или Win32? Называйте темы информативно


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

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

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