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

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

Войти
Регистрация
Восстановить пароль
 
 
RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
#1

OpenIM - не работает распараллеливание циклов - C++

23.02.2014, 19:01. Просмотров 725. Ответов 19
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void Multiplication(int a[5][5], int b[5][5]) {
    int c[5][5];
    int i;
    int j;
    int count(0);
 
    omp_set_num_threads(count);
    #pragma omp parallel
    #pragma omp for firstprivate(j) lastprivate(i)
    for(i = 0; i < 5; i+=1) // i = ряд матрицы a
    {
        for(j = 0; j < 5; j+=1) // j = столбец матрицы b
        {
          c [i][j] = a[i][j] * b[i][j];
        }
            cout << "V kakoe Kol-vo potokov poschet?"<<endl;
            cin >> count;
            omp_set_num_threads(count);
    }
    cout << "Kol-vo potokov: "<< omp_get_num_threads() << endl;
вот циклы, которые хочу распараллелить, что делаю не так?
считает только в один поток(((
и еще почему то компилятор не пропускает заключение #pragm'ы(ну то есть участка параллельного региона в {} скобки
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2014, 19:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос OpenIM - не работает распараллеливание циклов (C++):

Распараллеливание циклов - C++
Возникли трудности с освоением OpenMP Непонимаю, почему если закоментировать вот этот фрагмент кода, то программа работает вы разы...

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

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

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

Распараллеливание программы - C++
Помогите эту последовательную программу распараллелить на параллельных 2 процесса. #include &lt;iostream&gt; #include&lt;thread&gt; using...

Распараллеливание алгоритмов - C++
Доброго дня всем. Встал вопрос о выборе темы,связанной с распараллеливанием алгоритмов. Какие задачи наиболее &quot;восприимчивы&quot; к...

19
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
23.02.2014, 19:16 #2
RayPas, openMP, а не openIM.
Во-вторых, в Visual Studio зайдите в настройки проекта -> C++ и там в одной из вкладок нужно включить openMP

Не по теме:

p.s Вы случаем не из СФУ?

0
RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
23.02.2014, 19:22  [ТС] #3
включил еще до написания.
а вообще в коде может ошибки? потому что функции вызывает, но вот кажется процесс не распараллеливает

эммм, нет)
0
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
23.02.2014, 19:30 #4
RayPas,
Цитата Сообщение от RayPas Посмотреть сообщение
omp_set_num_threads(count);
кстати, а почему 0?
Цитата Сообщение от RayPas Посмотреть сообщение
int count(0);
А ещё
Цитата Сообщение от RayPas Посмотреть сообщение
omp_set_num_threads(count);
внутри блока
C++
1
#pragma omp parallel
это непредсказуемое поведение (UB)
0
RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
23.02.2014, 19:32  [ТС] #5
ну иниициализировал переменную - не? я ж ее потом ввожу , типа скоко потоков хочу...думал так
0
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
23.02.2014, 19:32 #6
RayPas, вводите кол-во потоков до того, как запускаете parallel-секцию, а не в ней
А ещё "
C++
1
firstprivate(j) lastprivate(i)
" вообще непонятно зачем.
0
RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
23.02.2014, 19:36  [ТС] #7
nexen,[B] попробовал...помогите плиз, что не так?
0
Миниатюры
OpenIM - не работает распараллеливание циклов  
RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
23.02.2014, 19:39  [ТС] #8
в документации нашел
У раздела firstprivate такая же семантика, но перед выполнением параллельного региона он указывает копировать значение частной переменной в каждый поток, используя конструктор копий, если это уместно.
0
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
23.02.2014, 19:57 #9
RayPas, ох.. Короче, "нате":
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void Multiplication(int a[5][5], int b[5][5]) {
    int c[5][5];
    int count, i;
cout << "V kakoe Kol-vo potokov poschet?"<<endl;
            cin >> count;
            omp_set_num_threads(count);
 
    omp_set_num_threads(count);
    #pragma omp parallel shared(i, c) //вот тут не помню, вроде как через запятую указываются
    #pragma omp for
    for(i = 0; i < 5; i+=1) // i = ряд матрицы a
    {
        for(j = 0; j < 5; j+=1) // j = столбец матрицы b
        {
          c [i][j] = a[i][j] * b[i][j];
        }
            
    }
    //cout << "Kol-vo potokov: "<< omp_get_num_threads() << endl; зачем? Вы их задали в count
А в документации Вы нашли все правильно, но, видимо, не поняли, что они пытались сказать. Они говорили, что если переменная инициализирована до параллельной секции, например, нулем, то написав firstprivate(variable), в каждом потоке создастся приватная переменная с таким же значением, как до параллельной секции (надеюсь, так понятнее.. хотя не уверен)
0
RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
23.02.2014, 20:02  [ТС] #10
nexen, а вот я таким образом,
//cout << "Kol-vo potokov: "<< omp_get_num_threads() << endl; зачем? Вы их задали в count
хотел узнать сколько потоков создалось , потому что это функция возвращает число потоков, входящих в текущую группу потоков....и вот что выдает
0
Миниатюры
OpenIM - не работает распараллеливание циклов  
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
23.02.2014, 20:06 #11
RayPas, что-то мне подсказывает, что a и b неинициализированы, или неверно переданны в качестве аргумента
А ещё я не уверен, что cout потокобезопасен
0
RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
23.02.2014, 20:10  [ТС] #12
не, все работало правильно, по крайней мере до введения прагм
0
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
23.02.2014, 20:12 #13
RayPas, значит cout не потокобезопасен. Сделайте так, где у вас стоит cout внутри parallel, оберните его в такую вещь:
C++
1
2
3
4
#pragma omp critical
{
cout << someVariable << endl;
}
решение, конечно, убогое, но если сработает, значит я прав
0
RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
23.02.2014, 20:17  [ТС] #14
nexen, вот как добавил

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
void Multiplication(int a[5][5], int b[5][5]) {
    int c[5][5];
    int count, i,j;
cout << "V kakoe Kol-vo potokov poschet?"<<endl;
            cin >> count;
            omp_set_num_threads(count);
 
            int someVariable;
 
    omp_set_num_threads(count);
    #pragma omp parallel shared(i, c) //вот тут не помню, вроде как через запятую указываются
    #pragma omp for
    for(i = 0; i < 5; i+=1) // i = ряд матрицы a
    {
        for(j = 0; j < 5; j+=1) // j = столбец матрицы b
        {
          c [i][j] = a[i][j] * b[i][j];
        }
            
    }
#pragma omp critical
{
cout << someVariable << endl;
}
и вот че выдает консоль

P.S. и еще почему j не в shared?
0
Миниатюры
OpenIM - не работает распараллеливание циклов  
nexen
187 / 180 / 3
Регистрация: 27.01.2012
Сообщений: 1,335
23.02.2014, 20:22 #15
RayPas, ох..
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
void Multiplication(int a[5][5], int b[5][5]) {
    int c[5][5];
    int count, i,j;
cout << "V kakoe Kol-vo potokov poschet?"<<endl;
            cin >> count;
            omp_set_num_threads(count);
 
    #pragma omp parallel shared(i, c) //вот тут не помню, вроде как через запятую указываются
    #pragma omp for
    for(i = 0; i < 5; i+=1) // i = ряд матрицы a
    {
        for(j = 0; j < 5; j+=1) // j = столбец матрицы b
        {
          c [i][j] = a[i][j] * b[i][j];
#pragma omp critical
{
cout << c[i][j] << " ";
}
        }
#pragma omp critical
{
cout << endl;
}
            
    }
}
Пробуй

p.s Откуда вообще *results* ? В этом коде я что-то не вижу, чтобы ты c[][] выводил
0
23.02.2014, 20:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.02.2014, 20:22
Привет! Вот еще темы с ответами:

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

Распараллеливание вычислений - C++
Здравствуйте. Может кто сможет подсказать как мне решить следующую задачу: необходимо распараллелить следующий последовательный код:...

Странное распараллеливание - C++
Добрый вечер, коллеги. У меня следующая проблема. Преподаватель сказал распараллелить программу, обрабатывающую изображения в папке....

Распараллеливание программы - C++
Пишу брутер и встал вопрос о добавление многопоточности. Вот у меня есть функция: std::string wbfunc(std::string&amp; hash) { ...


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

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

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