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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 59, средняя оценка - 4.63
qwrus
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
#1

Распараллеливание с помощью OpenMP - C++

05.05.2012, 13:11. Просмотров 8420. Ответов 41
Метки нет (Все метки)

Здравствуйте, уважаемые участники форума!

Имеется цикл вида:
C++
1
2
3
4
for (i=1; i<number; i++)
{
  do something;
}
Цикл выполняется (замерил) за, к примеру, 7 секунд. Моя задача заключается в том, чтобы с помощью технологии OpenMP сделать так, чтобы 2 (или лучше 4) последовательные итерации выполнялись одновременно параллельно на двух процессорах (на обычном компьютере с процессором i5). Т.е. цель - сделать то же за в 2 (или 4) раза меньшее время. Пытался сделать с помощью директив #pragma omp parallel, не получилось, выполняется за те же 7 секунд.

Буду благодарен за помощь.

P.S. Также буду благодарен за любые другие, более профессиональные реализации данной задачи с использованием технологии OpenMP.

Добавлено через 3 часа 58 минут
В догонку еще вопрос.
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
#include <stdio.h>
#include <iostream>
#include <time.h>
#include "TimeCounter.h"
#include <omp.h>
 
using namespace std;
 
void mode (void)
{
    if (omp_in_parallel()) cout<<"Parallel"<<endl;
    else cout<<"Posl"<<endl;
}
 
int main (void)
{
    double start, end;
    int n;
    mode();
    start = omp_get_wtime();
    omp_set_nested(1);
#pragma omp parallel private(n)
    {
        n = omp_get_thread_num();
#pragma omp parallel 
        {
            cout<<"Part 1, thread "<<n<<' '<<omp_get_thread_num()<<endl;
            mode();
        }
    }
    omp_set_nested(0);
    #pragma omp parallel private(n)
    {
        n = omp_get_thread_num();
#pragma omp parallel 
        {
            cout<<"Part 2, thread "<<n<<' '<<omp_get_thread_num()<<endl;
        }
    }
    end = omp_get_wtime();
    cout<<end-start<<endl;;
#pragma omp parallel
    {
#pragma omp master
        {
            mode();
        }
    }
}
Функция mode() проверяет, выполняется ли последовательная или параллельная область. Запускаю - везде выводится что последовательная. Есть идеи, почему?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.05.2012, 13:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Распараллеливание с помощью OpenMP (C++):

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

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

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

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

OpenMP. Время выполнения программы больше чем без OpenMP - C++
Сегодня первый раз сел за OpenMP. Читаю на сайте майкрософта как работает этот API. Так вот там сказано:&quot;Директива #pragma omp for...

OpenMP распараллеливание цикла - C++
Привет кодеры! Нужна ваша помощь. У меня есть код который нужно распараллелить и тем самым получить выигрыш по времени выполнения. Для...

41
qwrus
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
06.05.2012, 18:39  [ТС] #16
Скомпилировал вот без оптимизации, результат ужасный - если раньше выполнялось за 4 секунды, то сейчас за 25.
0
grizlik78
Эксперт С++
1957 / 1450 / 116
Регистрация: 29.05.2011
Сообщений: 3,012
06.05.2012, 18:42 #17
Ну, увеличение времени понятно, деление по модулю операция не быстрая. А результат в сравнении параллельно и нет как? У меня время практически одинаково. параллельный процентов 5 проигрывает всего.
1
qwrus
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
06.05.2012, 19:00  [ТС] #18
Я же написал выше, что когда запускал без параллельного, то было 4 секунды. А с параллельным стало 25.

Добавлено через 2 минуты
Если закомментить деление по модулю, то будет 8 секунд.
0
grizlik78
Эксперт С++
1957 / 1450 / 116
Регистрация: 29.05.2011
Сообщений: 3,012
06.05.2012, 19:01 #19
А нельзя ли всё-таки с оптимизацией попробовать?
0
qwrus
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
06.05.2012, 19:02  [ТС] #20
Как проверить включена она или нет, и если нет, как включить?
0
grizlik78
Эксперт С++
1957 / 1450 / 116
Регистрация: 29.05.2011
Сообщений: 3,012
06.05.2012, 19:05 #21
Ну так цель какая сейчас выбрана? Release или Debug?
0
qwrus
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
06.05.2012, 19:07  [ТС] #22
Realese.
0
grizlik78
Эксперт С++
1957 / 1450 / 116
Регистрация: 29.05.2011
Сообщений: 3,012
06.05.2012, 19:11 #23
Зачем же было говорить "без оптимизации"?
А какие результаты выводятся в том и в другом случае? r[...] = ?
На всякий случай можно ещё так попробовать написать: private(g,k,i) хотя ничего не должно измениться по идее.
1
qwrus
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
06.05.2012, 19:14  [ТС] #24
r[0] = 0
r[1] = 0
0
grizlik78
Эксперт С++
1957 / 1450 / 116
Регистрация: 29.05.2011
Сообщений: 3,012
06.05.2012, 19:22 #25
Чёрт, эти нули не показательны, там переполнение возможно. Давай изменим циклы, чтобы не было переполнений. Например так:
C++
1
2
3
4
5
6
7
        for (i = 0; i<1000000; i++)
        {
            for (k = 1; k<1000; k++)
            {
                g = g*k % 7321;
            }
        }
Что получилось?
1
qwrus
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
06.05.2012, 19:29  [ТС] #26
Тут такая деталька. Запустил на компе с 4 процами - отработала за 3,52 с.
0
grizlik78
Эксперт С++
1957 / 1450 / 116
Регистрация: 29.05.2011
Сообщений: 3,012
06.05.2012, 19:33 #27
Цитата Сообщение от qwrus Посмотреть сообщение
с 4 процами
С 4мя ядрами? А до этого сколько было ядер? У меня 2 ядра.
И всё-таки, результат тоже важен. У меня в результате вычислений в последнем варианте получается 1217. Вроде везде такое должно получаться.
1
qwrus
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
06.05.2012, 19:38  [ТС] #28
Что мы сейчас имеем. На 2 ядрах, у меня, старый вариант работает за 6,5 секунд. Два параллельных работают за 8,8; на 4 ядрах работает за 3,52.

Вот r[] везде нули у меня.
0
grizlik78
Эксперт С++
1957 / 1450 / 116
Регистрация: 29.05.2011
Сообщений: 3,012
06.05.2012, 20:24 #29
Цитата Сообщение от qwrus Посмотреть сообщение
Вот r[] везде нули у меня.
Вот это в первую очередь непонятно. С кодом из #25 должно получаться 1217. Если, конечно, g = 1 в параллельной секции не потерялось и деление по модулю не убиралось.
1
qwrus
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
07.05.2012, 03:27  [ТС] #30
Щас еще раз проверю. Но ускорение нормальное?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.05.2012, 03:27
Привет! Вот еще темы с ответами:

Параллельная программа для метода холецкого с помощью openMp и mpi - C++
Товарищи,помогите пожалуйста с параллельным программированием: надо написать параллельную программу для метода холецкого с помощью openMp...

Распараллеливание - C++
Всем добрый вечер. Если кто знает подскажите,мне надо распараллелить перемножение матриц,преподаватель сказал,что это делается просто с...

распараллеливание - C++
Скажите, кто-нибудь занимался распараллеливанием в си++? В моих попытках что-либо распараллелить через omp все выходило только в несколько...

Распараллеливание вычислений - C++
Вычисляю произведение матриц несколькими потоками (количество задаётся пользователем). Потоки &quot;засыпают&quot; на 1 мс. При вычислении...


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

Или воспользуйтесь поиском по форуму:
30
Yandex
Объявления
07.05.2012, 03:27
Ответ Создать тему
Опции темы

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