1 /*!
2  * Copyright 2021 by Contributors
3  */
4 #include "xgboost/span.h"
5 #include "xgboost/generic_parameters.h"
6 #include "xgboost/linalg.h"
7 #include "../common/device_helpers.cuh"
8 
9 namespace xgboost {
10 namespace gbm {
11 
GPUCopyGradient(HostDeviceVector<GradientPair> const * in_gpair,bst_group_t n_groups,bst_group_t group_id,HostDeviceVector<GradientPair> * out_gpair)12 void GPUCopyGradient(HostDeviceVector<GradientPair> const *in_gpair,
13                      bst_group_t n_groups, bst_group_t group_id,
14                      HostDeviceVector<GradientPair> *out_gpair) {
15   MatrixView<GradientPair const> in{
16       in_gpair,
17       {n_groups, 1ul},
18       {in_gpair->Size() / n_groups, static_cast<size_t>(n_groups)},
19       in_gpair->DeviceIdx()};
20   auto v_in = VectorView<GradientPair const>{in, group_id};
21   out_gpair->Resize(v_in.Size());
22   auto d_out = out_gpair->DeviceSpan();
23   dh::LaunchN(v_in.Size(), [=] __device__(size_t i) { d_out[i] = v_in[i]; });
24 }
25 
GPUDartPredictInc(common::Span<float> out_predts,common::Span<float> predts,float tree_w,size_t n_rows,bst_group_t n_groups,bst_group_t group)26 void GPUDartPredictInc(common::Span<float> out_predts,
27                        common::Span<float> predts, float tree_w, size_t n_rows,
28                        bst_group_t n_groups, bst_group_t group) {
29   dh::LaunchN(n_rows, [=] XGBOOST_DEVICE(size_t ridx) {
30     const size_t offset = ridx * n_groups + group;
31     out_predts[offset] += (predts[offset] * tree_w);
32   });
33 }
34 
GPUDartInplacePredictInc(common::Span<float> out_predts,common::Span<float> predts,float tree_w,size_t n_rows,float base_score,bst_group_t n_groups,bst_group_t group)35 void GPUDartInplacePredictInc(common::Span<float> out_predts,
36                               common::Span<float> predts, float tree_w,
37                               size_t n_rows, float base_score,
38                               bst_group_t n_groups, bst_group_t group) {
39   dh::LaunchN(n_rows, [=] XGBOOST_DEVICE(size_t ridx) {
40     const size_t offset = ridx * n_groups + group;
41     out_predts[offset] += (predts[offset] - base_score) * tree_w;
42   });
43 }
44 }  // namespace gbm
45 }  // namespace xgboost
46