diff --git a/src/objective/lambdarank_obj.cc b/src/objective/lambdarank_obj.cc index 4689a47ff369..f1c7548877c9 100644 --- a/src/objective/lambdarank_obj.cc +++ b/src/objective/lambdarank_obj.cc @@ -113,8 +113,11 @@ class LambdaRankObj : public FitIntercept { lj_full_.View(ctx_->Device()), &ti_plus_, &tj_minus_, &li_, &lj_, p_cache_); } else { - cpu_impl::LambdaRankUpdatePositionBias(ctx_, li_full_.View(ctx_->Device().IsSycl() ? DeviceOrd::CPU() : ctx_->Device()), - lj_full_.View(ctx_->Device().IsSycl() ? DeviceOrd::CPU() : ctx_->Device()), &ti_plus_, &tj_minus_, + // This function doesn't have sycl-specific implementation yet. + // For that reason we transfer data to host in case of sycl is used for propper execution. + auto device = ctx_->Device().IsSycl() ? DeviceOrd::CPU() : ctx_->Device(); + cpu_impl::LambdaRankUpdatePositionBias(ctx_, li_full_.View(device), + lj_full_.View(device), &ti_plus_, &tj_minus_, &li_, &lj_, p_cache_); } diff --git a/tests/cpp/objective/test_lambdarank_obj.cc b/tests/cpp/objective/test_lambdarank_obj.cc index 317318ccf39c..82441ea310ec 100644 --- a/tests/cpp/objective/test_lambdarank_obj.cc +++ b/tests/cpp/objective/test_lambdarank_obj.cc @@ -56,6 +56,7 @@ void TestNDCGGPair(Context const* ctx) { {0, 2, 4}, {2.06611f, -2.06611f, 0.0f, 0.0f}, {2.169331f, 2.169331f, 0.0f, 0.0f}); + CheckRankingObjFunction(obj, {0, 0.1f, 0, 0.1f}, {0, 1, 0, 1}, @@ -64,6 +65,7 @@ void TestNDCGGPair(Context const* ctx) { {2.06611f, -2.06611f, 2.06611f, -2.06611f}, {2.169331f, 2.169331f, 2.169331f, 2.169331f}); } + std::unique_ptr obj{xgboost::ObjFunction::Create("rank:ndcg", ctx)}; obj->Configure(Args{{"lambdarank_pair_method", "topk"}});