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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 59, средняя оценка - 4.63
qwrus
0 / 0 / 0
Регистрация: 10.03.2012
Сообщений: 24
05.05.2012, 13:11     Распараллеливание с помощью OpenMP #1
Здравствуйте, уважаемые участники форума!

Имеется цикл вида:
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() проверяет, выполняется ли последовательная или параллельная область. Запускаю - везде выводится что последовательная. Есть идеи, почему?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.05.2012, 13:11     Распараллеливание с помощью OpenMP
Посмотрите здесь:

Распараллеливание C++
Как выполнить распараллеливание с помощью OpenMP C++
Распараллеливание алгоритмов C++
Распараллеливание циклов с ипользованием OpenMP C++
распараллеливание C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
17.05.2012, 19:31     Распараллеливание с помощью OpenMP #41
Да кто его знает. Надо перейти к концу сессии. Например как-нибудь так:
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
#include <omp.h>
 
int main()
{
    bool stop_flag = false;
#pragma omp parallel
    {
        for ( ; ; )
        {
            int x = 0;
            // ...
            switch (x)
            {
                default:
                    stop_flag = true;
            }
            if (stop_flag)
                break;
 
            // ...
        }
    }
    if (stop_flag)
        return 0;
 
    // ...
    
    return 0;
}
Или даже так:
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
#include <omp.h>
 
int main()
{
    bool stop_flag = false;
#pragma omp parallel
    {
        for ( ; ; )
        {
            int x = 0;
            // ...
            switch (x)
            {
                default:
                    stop_flag = true;
                    goto end_parallel;
            }
 
            // ...
        }
end_parallel:;
    }
    if (stop_flag)
        return 0;
 
    // ...
    
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.10.2015, 19:46     Распараллеливание с помощью OpenMP
Еще ссылки по теме:

Распараллеливание циклов C++
Работа с OpenMP. Распараллеливание цикла for C++
C++ Для распараллеливание процессов лучше пользоваться OpenMP или Win32?

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

Или воспользуйтесь поиском по форуму:
Татьяна78695443
0 / 0 / 0
Регистрация: 22.10.2015
Сообщений: 2
22.10.2015, 19:46     Распараллеливание с помощью OpenMP #42
grizlik78, Здравствуйте, а вы на заказ делаете?

Добавлено через 1 минуту
grizlik78, а вы можете помочь распараллелить программу СЛАУ по схеме холецкого. сам код есть, а как распараллелить не понимаю.
Yandex
Объявления
22.10.2015, 19:46     Распараллеливание с помощью OpenMP
Ответ Создать тему
Опции темы

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