Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 19.08.2019
Сообщений: 8
1

Распараллеливание цикла проверки

09.02.2020, 13:34. Просмотров 1673. Ответов 8
Метки нет (Все метки)

Всем здравствуйте!
У меня есть метод, который проверяет элементы массива на обладание каким то свойством, но массив достаточно большой(~1 000 000) и проверка обладания каким то свойством выполняется достаточно долго (~2 секунды).
Для примера я приведу аналогичный метод AreThereEvenNumbers, который проверяет есть ли чётное число в массиве.
код:
C++
1
2
3
4
5
6
7
bool AreThereEvenNumbers()
{
    for (int i = 0; i < n; i++)
        if (array[i] % 2 == 0)
            return true;
    return false;
}
И если таким образом итеративно проверять каждый элемент в моём случае это получается очень долго. И вот мой вопрос:
Можно ли как то проверку разложить на потоки? Чтобы сразу несколько элементов проверялись одновременно.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.02.2020, 13:34
Ответы с готовыми решениями:

Распараллеливание цикла
есть цикл for (unsigned n = 0; n &lt; threads; n++) { func (sigma, sub_noisy, sub_basic,...

OpenMP распараллеливание цикла
Привет кодеры! Нужна ваша помощь. У меня есть код который нужно распараллелить и тем самым получить...

Работа с OpenMP. Распараллеливание цикла for
Доброго времени суток товарищи. При работе с OpenMP возник следующий вопрос Почему код int i;...

Распараллеливание цикла For с использованием OpenMP
Всем привет. Задался целью изучить OpenMP, что бы в дальнейшем уметь распараллеливать программы....

8
4810 / 3247 / 1355
Регистрация: 07.05.2019
Сообщений: 9,998
Записей в блоге: 1
09.02.2020, 17:40 2
Лучший ответ Сообщение было отмечено pechhenka как решение

Решение

Цитата Сообщение от pechhenka Посмотреть сообщение
Можно ли как то проверку разложить на потоки? Чтобы сразу несколько элементов проверялись одновременно.
C++
1
2
3
4
5
6
7
8
9
10
bool AreThereEvenNumbers()
{
    auto end = array + n;
    auto it = std::find_if(std::execution::par, array, end, [](auto &item)
    {
        return item % 2 == 0;
    });
 
    return it != end;
}
Добавлено через 29 секунд
https://en.cppreference.com/w/... licy_tag_t
2
650 / 410 / 173
Регистрация: 19.01.2019
Сообщений: 980
09.02.2020, 18:18 3
Цитата Сообщение от pechhenka Посмотреть сообщение
если таким образом итеративно проверять каждый элемент в моём случае это получается очень долго.
500451
Time taken: 0.0030s
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 <random>
#include <limits>
#include <time.h>
 
int main()
{
    size_t n = 1'000'000;
    int* arr(new int[n]);
    std::uniform_int_distribution<int> distribution(
        std::numeric_limits<int>::min(),
        std::numeric_limits<int>::max()
    );
    std::default_random_engine generator;
    std::generate(arr, arr + n, [&]() { return distribution(generator); });
 
    clock_t tStart = clock();
 
    size_t evenCnt(0);
    for (size_t i = 0; i < n; ++i)
        if (arr[i] % 2 == 0) ++evenCnt;
 
    std::cout << evenCnt << '\n';
 
    printf("Time taken: %.4lfs\n", (double)(clock() - tStart) / CLOCKS_PER_SEC);
    return 0;
}
Скиньте пример, чем вы его озадачили на 2 сек.
1
2533 / 1193 / 357
Регистрация: 30.11.2013
Сообщений: 3,817
09.02.2020, 18:24 4
nalbe666,
Цитата Сообщение от pechhenka Посмотреть сообщение
Для примера я приведу
Ему нужно раскрыть детали проекта и задания? Чем это вам поможет? Тема об параллельном запуске, а не о рефакторинге метода проверки на какое-то свойство
1
650 / 410 / 173
Регистрация: 19.01.2019
Сообщений: 980
09.02.2020, 18:40 5
rikimaru2013, Вопрос был адресован ТС, зачем вы вместо него отвечаете? Возможно, ответ поможет решить проблему другим путём, а может и нет. А о чём тема, я в названии прочёл, уточнения не нужны.
1
0 / 0 / 0
Регистрация: 19.08.2019
Сообщений: 8
09.02.2020, 19:49  [ТС] 6
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
nalbe666,
Ему нужно раскрыть детали проекта и задания? Чем это вам поможет? Тема об параллельном запуске, а не о рефакторинге метода проверки на какое-то свойство
Да я 2 секунды с потолка взял, чтобы не было ответов типа: "да это вообще не проблема возьми да перебери", "я почти уверен, что вашу задачу можно решить проще". А так у меня идёт проверка вхождения одних множеств в другие.

Добавлено через 9 минут
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
bool AreThereEvenNumbers()
{
    auto end = array + n;
    auto it = std::find_if(std::execution::par, array, end, [](auto &item)
    {
        return item % 2 == 0;
    });
 
    return it != end;
}
Добавлено через 29 секунд
https://en.cppreference.com/w/... licy_tag_t
Спасибо за ответ. Я прочитал документацию и они в примерах используют метод for_each. А вы в своём коде find_if(который как я прочитал просто итеративно перебирает). То есть как я понял надо использовать for_each?
0
4810 / 3247 / 1355
Регистрация: 07.05.2019
Сообщений: 9,998
Записей в блоге: 1
09.02.2020, 19:56 7
Цитата Сообщение от pechhenka Посмотреть сообщение
Спасибо за ответ. Я прочитал документацию и они в примерах используют метод for_each. А вы в своём коде find_if(который как я прочитал просто итеративно перебирает). То есть как я понял надо использовать for_each?
Если надо перебрать все элементы - используй for_each. Если найти первый подходящий, как в твоей AreThereEvenNumbers(), то find_if
1
0 / 0 / 0
Регистрация: 19.08.2019
Сообщений: 8
09.02.2020, 20:15  [ТС] 8
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Если надо перебрать все элементы - используй for_each. Если найти первый подходящий, как в твоей AreThereEvenNumbers(), то find_if
Мне их не нужно просто перебрать (в одном потоке - итерацией). Я бы хотел сразу в нескольких потоках перебирать для проверки
0
4810 / 3247 / 1355
Регистрация: 07.05.2019
Сообщений: 9,998
Записей в блоге: 1
09.02.2020, 20:26 9
Лучший ответ Сообщение было отмечено pechhenka как решение

Решение

Цитата Сообщение от pechhenka Посмотреть сообщение
Мне их не нужно просто перебрать (в одном потоке - итерацией). Я бы хотел сразу в нескольких потоках перебирать для проверки
Несколько потоков их и будет перебирать - либо пока не переберут все (for_each), либо пока не найдут нужный (find_if)

Добавлено через 2 минуты
Насколько я понял, то просто не знаешь, что такое std::for_each и std::find_if. Почитай для начала про них.

Добавлено через 1 минуту
У этих алгоритмов есть многопоточные (в смыле - которые исполняются параллельно) версии, у многих других - тоже, например у std::sort
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.02.2020, 20:26

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Блок проверки операторов цикла
1.блок проверки условного оператора цикла (if,if else) для вычисления: если F, то D=(B+C)/(B-C)...

Распараллеливание
Подскажите, что не так. Есть массив из 13 элементов, мне нужно разбить на три блока, один блок...

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

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


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

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

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