Alien-XGBoost
view release on metacpan or search on metacpan
xgboost/cub/cub/thread/thread_operators.cuh view on Meta::CPAN
* \brief Default min functor
*/
struct Min
{
/// Boolean min operator, returns <tt>(a < b) ? a : b</tt>
template <typename T>
__host__ __device__ __forceinline__ T operator()(const T &a, const T &b) const
{
return CUB_MIN(a, b);
}
};
/**
* \brief Arg min functor (keeps the value and offset of the first occurrence of the smallest item)
*/
struct ArgMin
{
/// Boolean min operator, preferring the item having the smaller offset in case of ties
template <typename T, typename OffsetT>
__host__ __device__ __forceinline__ KeyValuePair<OffsetT, T> operator()(
const KeyValuePair<OffsetT, T> &a,
const KeyValuePair<OffsetT, T> &b) const
{
// Mooch BUG (device reduce argmax gk110 3.2 million random fp32)
// return ((b.value < a.value) || ((a.value == b.value) && (b.key < a.key))) ? b : a;
if ((b.value < a.value) || ((a.value == b.value) && (b.key < a.key)))
return b;
return a;
}
};
/**
* \brief Default cast functor
*/
template <typename B>
struct Cast
{
/// Cast operator, returns <tt>(B) a</tt>
template <typename A>
__host__ __device__ __forceinline__ B operator()(const A &a) const
{
return (B) a;
}
};
/**
* \brief Binary operator wrapper for switching non-commutative scan arguments
*/
template <typename ScanOp>
class SwizzleScanOp
{
private:
/// Wrapped scan operator
ScanOp scan_op;
public:
/// Constructor
__host__ __device__ __forceinline__
SwizzleScanOp(ScanOp scan_op) : scan_op(scan_op) {}
/// Switch the scan arguments
template <typename T>
__host__ __device__ __forceinline__
T operator()(const T &a, const T &b)
{
T _a(a);
T _b(b);
return scan_op(_b, _a);
}
};
/**
* \brief Reduce-by-segment functor.
*
* Given two cub::KeyValuePair inputs \p a and \p b and a
* binary associative combining operator \p <tt>f(const T &x, const T &y)</tt>,
* an instance of this functor returns a cub::KeyValuePair whose \p key
* field is <tt>a.key</tt> + <tt>a.key</tt>, and whose \p value field
* is either b.value if b.key is non-zero, or f(a.value, b.value) otherwise.
*
* ReduceBySegmentOp is an associative, non-commutative binary combining operator
* for input sequences of cub::KeyValuePair pairings. Such
* sequences are typically used to represent a segmented set of values to be reduced
* and a corresponding set of {0,1}-valued integer "head flags" demarcating the
* first value of each segment.
*
*/
template <typename ReductionOpT> ///< Binary reduction operator to apply to values
struct ReduceBySegmentOp
{
/// Wrapped reduction operator
ReductionOpT op;
/// Constructor
__host__ __device__ __forceinline__ ReduceBySegmentOp() {}
/// Constructor
__host__ __device__ __forceinline__ ReduceBySegmentOp(ReductionOpT op) : op(op) {}
/// Scan operator
template <typename KeyValuePairT> ///< KeyValuePair pairing of T (value) and OffsetT (head flag)
__host__ __device__ __forceinline__ KeyValuePairT operator()(
const KeyValuePairT &first, ///< First partial reduction
const KeyValuePairT &second) ///< Second partial reduction
{
KeyValuePairT retval;
retval.key = first.key + second.key;
retval.value = (second.key) ?
second.value : // The second partial reduction spans a segment reset, so it's value aggregate becomes the running aggregate
op(first.value, second.value); // The second partial reduction does not span a reset, so accumulate both into the running aggregate
return retval;
}
};
( run in 0.537 second using v1.01-cache-2.11-cpan-d7f47b0818f )