Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
 Аватар для RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370

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

23.02.2014, 19:01. Показов 5143. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.02.2014, 19:01
Ответы с готовыми решениями:

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

Распараллеливание циклов
Есть такой цикл std::list&lt;int&gt;::iterator iter; std::list&lt;int&gt;_paramsFFT; for(iter = _paramsFFT.begin(); iter != _paramsFFT.end();...

Распараллеливание циклов
Доброго времени суток. Возникла необходимость распараллелить один численный алгоритм средствами OpenMP. В частности в этом алгоритме...

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

Не по теме:

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

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

эммм, нет)
0
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
23.02.2014, 19:30
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  [ТС]
ну иниициализировал переменную - не? я ж ее потом ввожу , типа скоко потоков хочу...думал так
0
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
23.02.2014, 19:32
RayPas, вводите кол-во потоков до того, как запускаете parallel-секцию, а не в ней
А ещё "
C++
1
firstprivate(j) lastprivate(i)
" вообще непонятно зачем.
0
 Аватар для RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
23.02.2014, 19:36  [ТС]
nexen,[B] попробовал...помогите плиз, что не так?
Миниатюры
OpenIM - не работает распараллеливание циклов  
0
 Аватар для RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
23.02.2014, 19:39  [ТС]
в документации нашел
У раздела firstprivate такая же семантика, но перед выполнением параллельного региона он указывает копировать значение частной переменной в каждый поток, используя конструктор копий, если это уместно.
0
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
23.02.2014, 19:57
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  [ТС]
nexen, а вот я таким образом,
//cout << "Kol-vo potokov: "<< omp_get_num_threads() << endl; зачем? Вы их задали в count
хотел узнать сколько потоков создалось , потому что это функция возвращает число потоков, входящих в текущую группу потоков....и вот что выдает
Миниатюры
OpenIM - не работает распараллеливание циклов  
0
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
23.02.2014, 20:06
RayPas, что-то мне подсказывает, что a и b неинициализированы, или неверно переданны в качестве аргумента
А ещё я не уверен, что cout потокобезопасен
0
 Аватар для RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
23.02.2014, 20:10  [ТС]
не, все работало правильно, по крайней мере до введения прагм
0
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
23.02.2014, 20:12
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  [ТС]
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?
Миниатюры
OpenIM - не работает распараллеливание циклов  
0
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
23.02.2014, 20:22
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
 Аватар для RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
23.02.2014, 20:30  [ТС]
вывод есть, просто его не писал тут, чтоб меньше букаф было, сделал так

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
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);
 
    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;
 
 
    cout << "**********Result**********" << endl;
    for(int i = 0; i < 5; i++) // i = ряд матрицы a
    {
        for(int j = 0; j < 5; j++) // j = столбец матрицы b
        {
#pragma omp critical
{
          cout << setw(15) << c[i][j] << setw(15); 
}
        }
        #pragma omp critical
{
        cout << endl;
    }
    }
}
выводит вот что
Миниатюры
OpenIM - не работает распараллеливание циклов  
0
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
23.02.2014, 20:43
RayPas, так вот как код то выглядел.. тогда можете убирать critical, убирать лишнюю 8 строчку. Пишете в цикле первом:
C++
1
2
3
4
for(int j = 0; j < 5; j+=1) // j = столбец матрицы b
        {
          c [i][j] = a[i][j] * b[i][j];
        }
вместо
C++
1
2
3
4
for(j = 0; j < 5; j+=1) // j = столбец матрицы b
        {
          c [i][j] = a[i][j] * b[i][j];
        }
и будет счастье
0
 Аватар для RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
23.02.2014, 20:50  [ТС]
nexen, так у меня в первом цикле так и написано...не понял что-то...
0
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
23.02.2014, 20:52
RayPas, просто скопируй. У тебя J вынесена из цикла и объявлена в функции, а не внутри каждого потока, в итоге она инкрементируется сразу всеми потоками. Того же эффекта (как в коде, что я привел выше для замены) можно добиться, если дописать :
C++
1
#pragma omp parallel shared(i, c)
до
C++
1
#pragma omp parallel shared(i, c) private(j)
либо так, либо так. Я спать
1
 Аватар для RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
23.02.2014, 20:58  [ТС]
nexen,чувак спасибо тебе большое) кол-во потоков сколько надо)))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.02.2014, 20:58
Помогаю со студенческими работами здесь

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

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

Распараллеливание вложенных циклов
Добрый день, у меня есть код на pygame для вывода изображений и кнопок, при наведении на кнопку она должна менять цвет, но программа не...

Распараллеливание циклов в OpenMP
Доброго времени суток. Собственно в чем заключается вопрос: есть код, который заполняет трехмерный массив. как эффективно распараллелить?...

[AMP] Распараллеливание вложенных циклов
Есть участок кода с многократно вложенными циклами,которые необходимо распараллелить с помощью C++AMP,но возникли некоторые...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru