Solve C Library Question: Thrust Max_Element

  • Thread starter Thread starter AIR&SPACE
  • Start date Start date
  • Tags Tags
    Nvidia
Click For Summary
SUMMARY

The forum discussion centers on the use of the thrust::max_element function from the Thrust library, specifically the version that requires a BinaryPredicate. The user encounters an error in their implementation, particularly on the line where the comparison occurs within the function. The header file extrema.h contains the necessary definitions, but the user questions whether the required function overload is missing or if there is an issue with the type of the PsiRes variable being passed to the function. The discussion highlights the importance of ensuring that the correct function signature and types are used.

PREREQUISITES
  • Familiarity with C++ templates and iterators
  • Understanding of the Thrust library and its functionalities
  • Knowledge of binary predicates in C++
  • Experience with debugging C++ code and analyzing error messages
NEXT STEPS
  • Review the Thrust library documentation for thrust::max_element and its overloads
  • Investigate the type and definition of the PsiRes variable to ensure compatibility
  • Learn about implementing custom binary predicates in C++
  • Explore debugging techniques for template functions in C++
USEFUL FOR

C++ developers, particularly those working with GPU programming and the Thrust library, as well as anyone troubleshooting template function errors in their code.

AIR&SPACE
Messages
100
Reaction score
0
So I'm trying to use max_element from the "thrust" library http://developer.nvidia.com/thrust" but am not sure the header file has the function it claims to have.
The header file for max_element can be found http://wiki.thrust.googlecode.com/hg/html/group__extrema.html#ga06e155dabb91848ffd1c5725f8e0ce14"

I am specifically interested in this version of the function:
Code:
template<typename ForwardIterator >
ForwardIterator 	thrust::max_element (ForwardIterator first, ForwardIterator last)

However, when I run my code it breaks when it tries to use the BinaryPredicate comp that is found in this version of the function:
Code:
template<typename ForwardIterator , typename BinaryPredicate >
ForwardIterator 	thrust::max_element (ForwardIterator first, ForwardIterator last, BinaryPredicate comp)

The header file, extrema.h is as follows (Note comment denoting where error occurs):
Code:
/*
 *  Copyright 2008-2011 NVIDIA Corporation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *//*! \file extrema.h
 *  \brief Host implementations of extrema functions.
 */

#pragma once

#include <thrust/pair.h>

namespace thrust
{
namespace detail
{
namespace host
{

template <typename ForwardIterator, typename BinaryPredicate>
ForwardIterator min_element(ForwardIterator first, 
                            ForwardIterator last,
                            BinaryPredicate comp)
{
    ForwardIterator imin = first;

    for (; first != last; first++)
    {
        if (comp(*first, *imin)) imin = first;
    }

    return imin;
}template <typename ForwardIterator, typename BinaryPredicate>
ForwardIterator max_element(ForwardIterator first, 
                            ForwardIterator last,
                            BinaryPredicate comp)
{
    ForwardIterator imax = first;

    for (; first != last; first++)
    {
        if (comp(*imax, *first)) imax = first; // ERROR OCCURS ON THIS LINE
    }

    return imax;
}template <typename ForwardIterator, typename BinaryPredicate>
thrust::pair<ForwardIterator,ForwardIterator> minmax_element(ForwardIterator first, 
                                                             ForwardIterator last,
                                                             BinaryPredicate comp)
{
    ForwardIterator imin = first;
    ForwardIterator imax = first;

    for (; first != last; first++)
    {
        if (comp(*first, *imin)) imin = first;
        if (comp(*imax, *first)) imax = first;
    }

    return thrust::make_pair(imin, imax);
}

} // end namespace host
} // end namespace detail
} // end namespace thrust

Here is the line where I call the function:
Code:
max_loc = thrust::max_element(PsiRes,(PsiRes+Nx*My));
So is it just me, or is the problem that the version of the function I'm trying to use is missing from the header file?
 
Last edited by a moderator:
Technology news on Phys.org

Similar threads

  • · Replies 30 ·
2
Replies
30
Views
5K
  • · Replies 17 ·
Replies
17
Views
7K
  • · Replies 49 ·
2
Replies
49
Views
12K
  • · Replies 1 ·
Replies
1
Views
2K
  • · Replies 12 ·
Replies
12
Views
5K