Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
34 / 22 / 13
Регистрация: 20.05.2022
Сообщений: 414

Разбиение потоков

30.10.2022, 19:46. Показов 1127. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Корректно ли так обрабатывать и разбивать потоки?
C++
1
2
3
4
5
6
7
8
9
#pragma omp parallel for
for(int i = 0; i < 5; i++)
{
#pragma omp parallel for
for(int j = 0; j < 1000; j++)
{
//функция перебора элементов вектора
}
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.10.2022, 19:46
Ответы с готовыми решениями:

Разбиение строки на слова - вынести разбиение в отдельную функцию
задача из Яндекс Практикума(вроде простая, но нет). Я уже два дня пытаюсь это реализовать, написал несколько вариантов, работают. Но...

Область видимости общей переменной для потоков + закрытие потоков
Есть два вопроса про потоки. Первый. Как можно сделать общую переменную для основного потока и моих ? struct ThreadInfo1 { int...

Создание и завершение процессов и потоков. Приоритеты выполнения потоков
Здравствуйте. Буду очень раз если поможете понять,что конкретно нужно сделать в вот этом задании,пока особого представления о...

9
фрилансер
 Аватар для Алексей1153
6451 / 5652 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
30.10.2022, 20:48
JIupToH, для внешнего цикла можно заюзать многопоточную версию std::for_each, внутренний цикл без потоков обойдётся, мне кажется.

а OMP тут не нужен
0
34 / 22 / 13
Регистрация: 20.05.2022
Сообщений: 414
30.10.2022, 20:56  [ТС]
Алексей1153, не просто перебираются данные, и там мне нужно разбить на подпотоки. В моем случае, разбиение идёт только в верхнем цикле. Во вложенном цикле нет разбиения…

Добавлено через 2 минуты
Алексей1153, я нашел примеры где выделяется секция, в которой реализовано распараллеливание. В этой секции выделяются два независимых цикла, в которых реализовано разбиение на потоки. Но вот вложенного примера с распараллеливание не нашел
0
фрилансер
 Аватар для Алексей1153
6451 / 5652 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
30.10.2022, 21:01
мои предположения - параллелить оба цикла есть неэффективно. Нужно либо внешний, либо внутренний

но можно попробовать все три варианта, затем сделать замеры и выбрать самый эффективный вариант
0
34 / 22 / 13
Регистрация: 20.05.2022
Сообщений: 414
30.10.2022, 21:10  [ТС]
Алексей1153, а как оба цикла? Можно пример, если нетрудно.

Добавлено через 38 секунд
Алексей1153, просто я представляю, как это должно быть, но вот как реализовать…
0
фрилансер
 Аватар для Алексей1153
6451 / 5652 / 1129
Регистрация: 11.10.2019
Сообщений: 15,054
30.10.2022, 21:22
Цитата Сообщение от JIupToH Посмотреть сообщение
а как оба цикла
два вложенных многопоточных std::for_each

Добавлено через 1 минуту
описание
0
34 / 22 / 13
Регистрация: 20.05.2022
Сообщений: 414
30.10.2022, 21:56  [ТС]
Алексей1153, спасибо, но немного не то
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
31.10.2022, 20:41
Цитата Сообщение от JIupToH Посмотреть сообщение
просто я представляю, как это должно быть
Попытался представить .

Два цикла - два объекта для распаралеливания (А - объемлющий цикл, Б - внутренний).
Первый цикл, просто отделяется в другой поток А от объемлющего потока Х.
Теперь при каждой итерации А вы хотите создать еще один поток для Б. ?
Всего породим потоков 1 (А) + N (Б) (N - итераций А) ?

Так и что не выходит ?
Насколько я знаю потоки запросто порождают другие потоки.
С OMP и его возможностями не знаком.
Может все же достаточно будет std::thread ?
0
694 / 304 / 99
Регистрация: 04.07.2014
Сообщений: 851
02.11.2022, 15:38
Лучший ответ Сообщение было отмечено JIupToH как решение

Решение

JIupToH, в данном случае лучше использовать клаузу collapse. Она объединит два цикла. Пример:

C
1
2
3
4
5
6
    #pragma omp parallel for collapse(2)
    for (int i = 0; i < 3; ++i) {
        for (int j = 0; j < 5; ++j) {
            printf("%d: (%d,%d)\n", omp_get_thread_num(), i, j);
        }
    }
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
0: (0,0)
0: (0,1)
0: (0,2)
0: (0,3)
1: (0,4)
1: (1,0)
1: (1,1)
1: (1,2)
2: (1,3)
2: (1,4)
2: (2,0)
2: (2,1)
3: (2,2)
3: (2,3)
3: (2,4)
Вложенный #pragma omp parallel, будет работать, только если это явно разрешить. Рабочий пример:
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
#include <iostream>
#include <sstream>
#include <thread>
 
#include <omp.h>
 
int main()
{
 
    #pragma omp parallel for
    for (int i = 0; i < 3; ++i) {
        int i_tn = omp_get_thread_num();
 
        #pragma omp parallel for
        for (int j = 0; j < 5; ++j) {
            auto id   = std::this_thread::get_id();
            int  j_tn = omp_get_thread_num();
 
            std::stringstream ss;
            ss << i_tn << "." << j_tn << "." << id << ": (" << i << "," << j << ")\n";
 
            std::cout << ss.str();
        }
    }
 
    return 0;
}
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ ./a.out | sort
0.0.139816776419264: (0,0)
0.0.139816776419264: (0,1)
0.0.139816776419264: (0,2)
0.0.139816776419264: (0,3)
0.0.139816776419264: (0,4)
1.0.139816776414784: (1,0)
1.0.139816776414784: (1,1)
1.0.139816776414784: (1,2)
1.0.139816776414784: (1,3)
1.0.139816776414784: (1,4)
2.0.139816768022080: (2,0)
2.0.139816768022080: (2,1)
2.0.139816768022080: (2,2)
2.0.139816768022080: (2,3)
2.0.139816768022080: (2,4)
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ OMP_NESTED=true ./a.out  | sort
0.0.140066251462592: (0,0)
0.0.140066251462592: (0,1)
0.1.140065957844544: (0,2)
0.2.140066226280000: (0,3)
0.3.140066122884672: (0,4)
1.0.140066251458112: (1,0)
1.0.140066251458112: (1,1)
1.1.140066209494592: (1,2)
1.2.140066131277376: (1,3)
1.3.140066114491968: (1,4)
2.0.140066243065408: (2,0)
2.0.140066243065408: (2,1)
2.1.140066217887296: (2,2)
2.2.140065957844544: (2,3)
2.3.140066122884672: (2,4)
Т.е. в первом вызове было создано три потока, в каждом из которых вложенная параллельная секция не запускала дополнительных потоков.

При втором запуске, чрез переменную окружения было разрешено вложенным параллельным секциям порождать потоки, и программа создала 12 (3*4) потоков.

Так же стоит обратить внимание, что при вложенной параллельной секции меняется результат omp_get_thread_num и мне приходится вызывать его дважды.
1
34 / 22 / 13
Регистрация: 20.05.2022
Сообщений: 414
04.11.2022, 16:40  [ТС]
AlexVRud, спасибо за пример) И развернутое пояснение допущенной мной ошибки! Спасибо милчеловек!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.11.2022, 16:40
Помогаю со студенческими работами здесь

QR -разбиение
Доброго всем времени суток. У кого есть красиво написанное QR-разложение матриц с помощью преобразования Хаусхолдера? Если не сложно,...

Количество потоков в системе. Вывод потоков сервера. Дельта приоритеты
Здравствуйте, создаю сокетное клиент серверное приложение, работает через консоль. Как вывести количество потоков в системе? Как вывести...

Определить количество потоков в процессе, базовый приоритет, исследовать изменения приоритета потоков
Напишите программу на C#, запускающую новый процесс (любое приложение). Определите количество потоков в запущенном процессе, базовый...

Замедление работы потоков если запущено несколько потоков
Есть отдельный поток который движет красным квадратом. Он каждую миллисекунду меняет положение квадрата на пиксель. Есть другой поток, он...

Разработать программу, генерирующую n потоков в пуле потоков CLR
Добрый вечер. Решил поделать старые лабораторные, которые мне уже давно нужно было сдавать, но встрял на одном задании: &quot;Разработать...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru