Найдите максимальное значение с помощью ppl.h

Есть ли простая функция в библиотеке ppl для C++, где вы можете сделать что-то вроде Concurrency::max(vec), где vec — это вектор чисел? Я могу написать свой собственный, но я надеялся, что смогу сэкономить себе работу.

Редактировать: Извините, может быть, я недостаточно ясно выразился. Мне нужна функция max для использования распараллеливания.


person spurra    schedule 08.04.2014    source источник
comment
Похоже, вам нужно уменьшить карту, но честно говоря, это действительно раздел разделяй и властвуй.   -  person Mgetz    schedule 08.04.2014
comment
Я не понимаю, как я мог бы использовать уменьшение карты. Думаю, мне придется написать свой собственный подход «разделяй и властвуй».   -  person spurra    schedule 08.04.2014
comment
Ну, если быть предельно честным, если только этот вектор не имеет порядка гигабайта и частично не закачивается на диск. Однопоточный подход с использованием значения на основе max, скорее всего, превзойдет что-либо параллельное. Современный процессор очень оптимизирован для такого рода вещей.   -  person Mgetz    schedule 08.04.2014


Ответы (2)


В нем нет ничего встроенного, но все просто с комбинируемым (редукционная переменная) и параллельным циклом (здесь parallel_for_each). Однако, если работа, которую вы выполняете, состоит только из «максимальных» чисел, если только количество чисел, на которые вы смотрите, не очень велико, может быть трудно увидеть ускорение.

Подробнее об этом можно прочитать на странице msdn:

#include <ppl.h>
#include <climits>
#include <vector>
#include <numeric>
#include <iostream>
using namespace Concurrency;
int main(int argc, _TCHAR* argv[])
{
    std::vector<int> vec(10);
    std::iota( begin(vec), end(vec), 1);
    combinable<int> locals([]{ return INT_MIN; });
    parallel_for_each( begin(vec), end(vec), [&locals](int cur){
        auto & localMax = locals.local();
        localMax = std::max(cur, localMax);
    });
    std::cout << "max is " << locals.combine([](int left, int right){ return std::max<int>(left, right);}) << std::endl;
    return 0;
}
person Rick    schedule 08.04.2014

Это просто std::vector? Если это так, вы можете использовать max_element.

auto it = std::max_element(std::begin(vec), std::end(vec));

Затем итератор it указывает на элемент вектора с максимальным значением.

person Cory Kramer    schedule 08.04.2014
comment
Это работает параллельно? - person spurra; 08.04.2014
comment
Для одного вектора vec нет, не верю. По сути, он просто проходит весь вектор от begin() до end() и отслеживает максимальный элемент. - person Cory Kramer; 08.04.2014
comment
Приношу свои извинения за недостаточно ясность. Я хотел бы, чтобы функция max использовала все мои ядра ЦП. Вектор, через который я прохожу, довольно велик. - person spurra; 08.04.2014