Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 08.10.2013
Сообщений: 101
1

Применение OpenMP

20.05.2018, 00:13. Просмотров 560. Ответов 4
Метки нет (Все метки)

Здравствуйте. Хотелось бы внедрить многопоточность в описанную ниже задачу.

Имеется класс:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
std::map<int, long> buff;
 
class Test
{
    int t;
public:
    Test() { };
    void func(const int &i,const  int &k);
 
 
};
 
void Test::func(const int &i, const int &k)
{
 
    t = k + 123;
    buff.insert(std::pair<int, long>(i, t));
}
Требуется вызвать func() более https://www.cyberforum.ru/cgi-bin/latex.cgi?{2}^{20} раз и вывести сумму вторых элементов контейнера buff.
Т.к. это занимает немало времени, хотелось бы использовать многопоточность (интересует именно на этапе вызова функции, не на этапе подсчета суммы), к примеру, так:
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
#include<iostream>
#include<omp.h>
#include<map>
int main()
{
 
    int i;
 
#pragma omp parallel for
    for (i = 0; i < 50000000; i++)
    {
        Test *qwe = new Test;
        qwe->func(i, i+2);
        delete qwe;
    }
 
    unsigned long long summ = 0;
 
    for (auto it = buff.begin(); it != buff.end(); it++)
    {
        summ += (*it).second;
    }
    
    
    return 0;
}
Цикл, к которому применяется многопоточность, имеет независимые итерации. Ожидается, что каждый поток работает с членами своего экземпляра класса. Но нет выигрыша в скорости в сравнении с выполнением цикла одним потоком, да и результат при таком подходе не совпадает с получаемым при прогоне цикла 1 потоком.
Хотелось бы понять, в чем ошибка.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.05.2018, 00:13
Ответы с готовыми решениями:

OpenMP. Время выполнения программы больше чем без OpenMP
Сегодня первый раз сел за OpenMP. Читаю на сайте майкрософта как работает этот API. Так вот там...

OpenMP
Задание 2. Исследовать влияние настроек параметра shedule (не менее 4 опций ) парадигмы #omp...

OpenMP
#pragma omp parallel private(i) shared(j) { #pragma omp for for (j = 0; j &lt; n; j++)...

OpenMP
есть код в общем виде... #pragma omp parallel for for (i = 0; i &lt; n; ++i) { temp = B; //...

4
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 971
20.05.2018, 10:24 2
По факту, "описанная ниже задача" не имеет смысла) проще сразу считать сумму. Но да ладно.

Цитата Сообщение от digitallivecam Посмотреть сообщение
да и результат при таком подходе не совпадает с получаемым при прогоне цикла 1 потоком
дело в том, что изменение контейрера нужно делать потоко безопасным, т.е. нужно указать критическую секцию:
C++
1
2
3
4
#pragma omp critical
{
   buff.insert(std::pair<int, long>(i, t));
}
Цитата Сообщение от digitallivecam Посмотреть сообщение
нет выигрыша в скорости в сравнении с выполнением цикла одним потоком
сейчас нет возможности потестить.


P.S.
C++
1
2
3
Test *qwe = new Test;
qwe->func(i, i+2);
delete qwe;
какой смысл определять переменные в куче? быстрее работать в стеке:

C++
1
2
Test qwe;
qwe.func(i, i+2);
и допишите inline перед определением ф-ии func. А лучше определите её в классе.
0
0 / 0 / 0
Регистрация: 08.10.2013
Сообщений: 101
20.05.2018, 12:46  [ТС] 3
Реализовал все предложенные доработки, картина не изменилась. Скоростные характеристики лучше не становятся и сумма не сходится.
Уточню, что сумма считается для проверки совпадения результатов при многопоточном и однопоточном режимах обработки цикла.

Цитата Сообщение от mat_for_c Посмотреть сообщение
дело в том, что изменение контейрера нужно делать потоко безопасным, т.е. нужно указать критическую секцию:
C++Выделить код
C++
1
2
3
4
#pragma omp critical
{
  buff.insert(std::pair<int, long>(i, t));
}
0
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 971
20.05.2018, 14:28 4
Цитата Сообщение от digitallivecam Посмотреть сообщение
Скоростные характеристики лучше не становятся
а чего вы хотели от расспараллеливания, если вы с помощью него только вставляете данные в контейнер. прочитайте про гонки данных и критические секции - поймёте, почему нет выигрыша в скорости.

Цитата Сообщение от digitallivecam Посмотреть сообщение
и сумма не сходится
да ладно, быть такого не может
0
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 971
20.05.2018, 14:31 5
Кликните здесь для просмотра всего текста
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
#include<iostream>
#include<map>
#include<omp.h>
 
std::map<int, long> buff;
 
class Test
{
   int t;
public:
   Test() { };
   void func(const int &i, const  int &k)
   {
      t = k + 123;
 
#pragma omp critical
      {
         buff.insert(std::pair<int, long>(i, t));
      }
   }
};
 
 
int main()
{
   int i;
 
   for (i = 0; i < 50000000; i++)
   {
      Test qwe;
      qwe.func(i, i + 2);
   }
 
   unsigned long long summ = 0;
 
   for (auto it = buff.begin(); it != buff.end(); ++it)
   {
      summ += (*it).second;
   }
   
   std::cout << "whithout OpenMP: " << summ << '\n';
 
   buff.clear();
 
#pragma omp parallel for
   for (i = 0; i < 50000000; i++)
   {
      Test qwe;
      qwe.func(i, i + 2);
   }
 
   summ = 0;
 
   for (auto it = buff.begin(); it != buff.end(); ++it)
   {
      summ += (*it).second;
   }
 
   std::cout << "whit OpenMP: " << summ << '\n';
 
   return 0;
}
0
Миниатюры
Применение OpenMP  
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.05.2018, 14:31

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Параллельность в openMP
Использую Visual Studio 2013. Проц - двухъядерный Intel E6550. omp_get_max_threads() возвращает 2,...

Технологии OpenMP
Доброго времени суток. Объясните, почему на такой код void quickSortR(int left,int right,int...

OpenMP цикл for
Здравствуйте. Хочу что бы каждый поток вывел по 2 случайных числа, используя цикл for. Вот...

Цикл for и OpenMP
Недавно распаралелил свой цикл for, а теперь решил посмотреть на сколько я выигрываю от этого. Но...


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

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

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