Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
 Аватар для ronaldo
94 / 48 / 63
Регистрация: 16.06.2014
Сообщений: 386

Как распараллелить цикл while?

31.03.2015, 17:05. Показов 4041. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
При распараллелировании применять технологии Openmp.
Было бы здорово, если бы ответ на вопрос, что в заглавии, был проиллюстрирован на примере:
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
#include <iostream>
#include <omp.h>
using namespace std;
 
int main() {
    
    unsigned __int64 size,chi,b;
    double time;
    int a;
    cin>>size;
    b=size+1;
    time=omp_get_wtime();
    while (b>size)
    {unsigned __int64 sum=0;
     size++;
     chi=size;
     while (chi!=0)
     {a=chi%10;chi=chi/10;sum+=a;}
     if (sum!=1) {b=1;
                  while (b<size)
                   b*=sum;}
      else b=size+1;               
    }
    cout<<b<<endl;
    cout<<omp_get_wtime()-time<<endl;
}
Программа находит минимальное число, большее заданного, которое равно сумме своих десятичных цифр, возведённой в степень, большую 1.

Добавлено через 1 час 20 минут
И нужно, чтобы параллельная прога быстрее работала (потому в вышеприведённом коде функция получения текущего времени присутствует).
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.03.2015, 17:05
Ответы с готовыми решениями:

Распараллелить цикл
Распараллелить цикл: For(i=2;i&lt;N;i++) For(j=2;i&lt;N;j++) A =A +A; #include &lt;iostream&gt; #include &lt;omp.h&gt; #include...

Помогите распараллелить цикл!!!
Эксперты помогите, распараллелить консольное приложение на два(или четыре) ядра. Раньше ни когда не сталкивался с этим, даже не знаю, что...

Не получается распараллелить цикл
Добрый день! В ходе опытов я выяснил, что распараллеливание цикла for с помощью OMP не приносит выигрыша во времени. Т.е. код...

8
34 / 44 / 9
Регистрация: 14.03.2015
Сообщений: 134
31.03.2015, 17:13
а почему именно Openmp? есть же более удобные вещи? Например MPI.
0
 Аватар для ronaldo
94 / 48 / 63
Регистрация: 16.06.2014
Сообщений: 386
31.03.2015, 17:19  [ТС]
Цитата Сообщение от Super__Enot Посмотреть сообщение
а почему именно Openmp?
Задание такое
0
34 / 44 / 9
Регистрация: 14.03.2015
Сообщений: 134
31.03.2015, 17:26
попробуй MPI там все просто, подключаешь библиотеку, в ини-файле указываешь количество процессов(желательно чтоб оно было равно количеству процессоров или ядер) далее определяешь мастер процесс в нем считываешь данные и рассылаешь остальным процессам. выглядит все просто.
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
...
if (MyRang==MASTER)
{
unsigned __int64 size,chi,b;
    double time;
    int a;
    cin>>size;
    b=size+1;
    time=omp_get_wtime()
}
 
//далее рассылка переменных с припиской ALL_WORLD 
while (b>size)
    {unsigned __int64 sum=0;
     size++;
     chi=size;
     while (chi!=0)
     {a=chi%10;chi=chi/10;sum+=a;}
     if (sum!=1) {b=1;
                  while (b<size)
                   b*=sum;}
      else b=size+1;               
    }
    cout<<b<<endl;
    cout<<omp_get_wtime()-time<<endl;
...
Добавлено через 2 минуты
ну если задание то тут только Google тебе в помощь , есть MSDN там довольно подробные пример правда на английском и очень много кода.
1
 Аватар для ronaldo
94 / 48 / 63
Регистрация: 16.06.2014
Сообщений: 386
31.03.2015, 20:28  [ТС]
Можно ли как-то сделать, чтобы цикл (строки 13-23 кода из 1го поста) вызывался для нескольких потоков (например, четырёх) и чтобы у одного потока было значение size одно, у другого - другое...?
Можно ли как-то сделать, чтобы как только хотя бы один поток завершал выполнение цикла (строки 13-23 кода из 1го поста), то остальные тоже бы завершали работу, а на экран (строка 24) выводилось значение b из того потока, который первым завершил выполнение цикла?

Добавлено через 1 час 9 минут
Проблема в том, что неизвестно, когда мы искомое число найдём, и нельзя указать, сколько раз будет выполняться цикл (строки 13-23). Поэтому приходится использовать цикл while. Но он ведь тоже как-то параллелится?
0
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
31.03.2015, 20:38
Если у вас VS2010 и выше,можете также попробовать:
PPL
1
 Аватар для ronaldo
94 / 48 / 63
Регистрация: 16.06.2014
Сообщений: 386
31.03.2015, 22:53  [ТС]
S_el, у меня Dev-C++ 5.7.1.

Добавлено через 1 час 33 минуты
Кто-нибудь может ответить хоть на один вопрос из пятого поста?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
01.04.2015, 00:42
Цитата Сообщение от ronaldo Посмотреть сообщение
Можно ли как-то сделать, чтобы цикл (строки 13-23 кода из 1го поста) вызывался для нескольких потоков (например, четырёх) и чтобы у одного потока было значение size одно, у другого - другое...?
std::thread. Просто как три копейки, хотя и требует вынести цикл в отдельную функцию. Правда, не в курсе имеет ли оно какое либо отношение к Openmp.
1
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
01.04.2015, 00:55
Цитата Сообщение от Renji Посмотреть сообщение
Правда, не в курсе имеет ли оно какое либо отношение к Openmp.
Насколько мне известно фреймворк OpenMP не имеет ни малейшего отношения к std::thread.

По теме могу только подкинуть ссылок,правда они на английском:
http://openmp.org/wp/
https://www.youtube.com/playli... 5X2utwnoEG
http://en.wikipedia.org/wiki/OpenMP

ну и в интернете можно найти книгу:
Using OpenMP: Portable Shared Memory Parallel Programming Barbara Chapman, Gabriele Jost, Ruud van der Pas (2007)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.04.2015, 00:55
Помогаю со студенческими работами здесь

Распараллелить цикл со сложной индексацией используя OpenMP
Пусть есть такой цикл, преобразующий массив: #define N 6 #define RADIUS 1 int arr; int flag; int x,y; do { flag = 0;

Как распараллелить обработку массива данных?
Есть массив данных. Есть функция, которая обрабатывает элемент этого массива. Надо распараллелить обработку. Для этого хочу в цикле...

MPI. Как распараллелить алгоритм нахождение нормы матрицы
собственно задача описана в заголовке. разобрал все функции MPI, но как применить к этому алгоритму - хз. везде в примерах легкотня одна. ...

Как распараллелить определение является ли число степенью двойки
Все числа большие, целые и положительные. bool BigInt::isPowerOfTwo(const BigInt &amp;x) { if (x.a &amp; 1 == 1) // если число...

Не могу разобраться с OpenMP! Как правильно распараллелить формулу?
Только начинаю изучать ПП. Помогите разобраться как распараллелить формулу. Данные зависимы. Не могли бы показать на данном примере как...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
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 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru