Найти максимальный элемент в массиве с помощью PPL

Мне нужно реализовать функцию, которая бы находила самый большой элемент в массиве с плавающей запятой, используя ppl.h.

У меня есть этот код, основанный на этом ответе:

float find_largest_element_in_matrix_PPL(float* m, size_t dims)
{
    float max_element;
    int row, col;
    concurrency::combinable<float> locals([] { return INT_MIN + 0.f; });
    concurrency::parallel_for_each(size_t(0), dims * dims, [&locals](int curr)
    {
        float & localMax = locals.local();
        localMax = max<float>(localMax, curr);
    });

    max_element = locals.combine([](float left, float right) { return max<float>(left, right); });
    cout << max_element << endl;
    return max_element;
}

Однако есть проблема с этим кодом:

  • Перед выполнением он выдает следующее исключение:

Ошибка C2780 'void Concurrency::_Parallel_for_each_impl(const _Random_iterator &,const _Random_iterator &,const _Function &,_Partitioner &&,std::random_access_iterator_tag)': ожидает 5 аргументов - 4 предоставленных parp D:\Microsoft Visual Studio 14.0\VC\include\ 2987 чел.ч

Ошибка C2780 'void Concurrency::_Parallel_for_each_impl(_Forward_iterator,const _Forward_iterator &,const _Function &,const Concurrency::auto_partitioner &,std::forward_iterator_tag)': ожидается 5 аргументов - 4 предоставленных parp D:\Microsoft Visual Studio 14.0\VC\ включить\ppl.h 2987

Ошибка C2893 Не удалось специализировать шаблон функции 'iterator_traits‹_Iter>::iterator_category std::_Iter_cat(const _Iter &)' parp D:\Microsoft Visual Studio 14.0\VC\include\ppl.h 2987


  1. Не могли бы вы помочь мне с решением этой проблемы?

  2. Как я могу переписать код, чтобы использовать parallel_for? (Я не могу ссылаться на аргумент массива, переданный функции в блоке parallel_for)


person Denis Yakovenko    schedule 16.12.2015    source источник
comment
Вы используете параметры parallel_for и функцию parallel_for_each. В этом случае вам, вероятно, следует использовать parallel_for, а не parallel_for.   -  person Rick    schedule 16.12.2015
comment
@Rick, спасибо, я изменил код на parallel_for, и ошибка исчезла. Но теперь функция возвращает только индекс последнего элемента в массиве. Любые идеи о том, как заставить его работать правильно?   -  person Denis Yakovenko    schedule 16.12.2015
comment
@Rick извините за введение в заблуждение, он не возвращает никакого индекса, он просто возвращает ноль.   -  person Denis Yakovenko    schedule 16.12.2015


Ответы (1)


float SimpleTest::SimpleTestfind_largest_element_in_matrix_PPL(float* m, size_t dims)
{
    float max_element;
    concurrency::combinable<float> locals([&]{ return INT_MIN + 0.f; });
    int last= dims*dims;
    concurrency::parallel_for(0, last, [&](int curr)
    {
        float & localMax = locals.local();
        localMax = max<float>(localMax, curr);
    });

    max_element = locals.combine([](float left, float right) { return max<float>(left, right); });
    std::cout << max_element << endl;
    return max_element;
}

Может быть, это сработает

person SoonJong Jung Jung Troubler    schedule 19.03.2020