Make binary bin search reusable. (#6058)
* Move binary search row to hist util. * Remove dead code.
This commit is contained in:
@@ -34,7 +34,7 @@ namespace tree {
|
||||
* to avoid outliers, as the full reduction is reproducible on GPU with reduction tree.
|
||||
*/
|
||||
template <typename T>
|
||||
DEV_INLINE __host__ T CreateRoundingFactor(T max_abs, int n) {
|
||||
XGBOOST_DEV_INLINE __host__ T CreateRoundingFactor(T max_abs, int n) {
|
||||
T delta = max_abs / (static_cast<T>(1.0) - 2 * n * std::numeric_limits<T>::epsilon());
|
||||
|
||||
// Calculate ceil(log_2(delta)).
|
||||
@@ -53,20 +53,20 @@ struct Pair {
|
||||
GradientPair first;
|
||||
GradientPair second;
|
||||
};
|
||||
DEV_INLINE Pair operator+(Pair const& lhs, Pair const& rhs) {
|
||||
XGBOOST_DEV_INLINE Pair operator+(Pair const& lhs, Pair const& rhs) {
|
||||
return {lhs.first + rhs.first, lhs.second + rhs.second};
|
||||
}
|
||||
} // anonymous namespace
|
||||
|
||||
struct Clip : public thrust::unary_function<GradientPair, Pair> {
|
||||
static DEV_INLINE float Pclip(float v) {
|
||||
static XGBOOST_DEV_INLINE float Pclip(float v) {
|
||||
return v > 0 ? v : 0;
|
||||
}
|
||||
static DEV_INLINE float Nclip(float v) {
|
||||
static XGBOOST_DEV_INLINE float Nclip(float v) {
|
||||
return v < 0 ? abs(v) : 0;
|
||||
}
|
||||
|
||||
DEV_INLINE Pair operator()(GradientPair x) const {
|
||||
XGBOOST_DEV_INLINE Pair operator()(GradientPair x) const {
|
||||
auto pg = Pclip(x.GetGrad());
|
||||
auto ph = Pclip(x.GetHess());
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ template <typename GradientSumT>
|
||||
GradientSumT CreateRoundingFactor(common::Span<GradientPair const> gpair);
|
||||
|
||||
template <typename T>
|
||||
DEV_INLINE T TruncateWithRoundingFactor(T const rounding_factor, float const x) {
|
||||
XGBOOST_DEV_INLINE T TruncateWithRoundingFactor(T const rounding_factor, float const x) {
|
||||
return (rounding_factor + static_cast<T>(x)) - rounding_factor;
|
||||
}
|
||||
|
||||
|
||||
@@ -114,58 +114,6 @@ struct DeviceSplitCandidateReduceOp {
|
||||
}
|
||||
};
|
||||
|
||||
struct DeviceNodeStats {
|
||||
GradientPair sum_gradients;
|
||||
float root_gain {-FLT_MAX};
|
||||
float weight {-FLT_MAX};
|
||||
|
||||
/** default direction for missing values */
|
||||
DefaultDirection dir {kLeftDir};
|
||||
/** threshold value for comparison */
|
||||
float fvalue {0.0f};
|
||||
GradientPair left_sum;
|
||||
GradientPair right_sum;
|
||||
/** \brief The feature index. */
|
||||
int fidx{kUnusedNode};
|
||||
/** node id (used as key for reduce/scan) */
|
||||
NodeIdT idx{kUnusedNode};
|
||||
|
||||
XGBOOST_DEVICE DeviceNodeStats() {} // NOLINT
|
||||
|
||||
template <typename ParamT>
|
||||
HOST_DEV_INLINE DeviceNodeStats(GradientPair sum_gradients, NodeIdT nidx,
|
||||
const ParamT& param)
|
||||
: sum_gradients(sum_gradients),
|
||||
idx(nidx) {
|
||||
this->root_gain =
|
||||
CalcGain(param, sum_gradients.GetGrad(), sum_gradients.GetHess());
|
||||
this->weight =
|
||||
CalcWeight(param, sum_gradients.GetGrad(), sum_gradients.GetHess());
|
||||
}
|
||||
|
||||
HOST_DEV_INLINE void SetSplit(float fvalue, int fidx, DefaultDirection dir,
|
||||
GradientPair left_sum, GradientPair right_sum) {
|
||||
this->fvalue = fvalue;
|
||||
this->fidx = fidx;
|
||||
this->dir = dir;
|
||||
this->left_sum = left_sum;
|
||||
this->right_sum = right_sum;
|
||||
}
|
||||
|
||||
HOST_DEV_INLINE void SetSplit(const DeviceSplitCandidate& split) {
|
||||
this->SetSplit(split.fvalue, split.findex, split.dir, split.left_sum,
|
||||
split.right_sum);
|
||||
}
|
||||
|
||||
/** Tells whether this node is part of the decision tree */
|
||||
HOST_DEV_INLINE bool IsUnused() const { return (idx == kUnusedNode); }
|
||||
|
||||
/** Tells whether this node is a leaf of the decision tree */
|
||||
HOST_DEV_INLINE bool IsLeaf() const {
|
||||
return (!IsUnused() && (fidx == kUnusedNode));
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct SumCallbackOp {
|
||||
// Running prefix
|
||||
|
||||
Reference in New Issue
Block a user