[SYC]. Implementation of HostDeviceVector (#10842)

This commit is contained in:
Dmitry Razdoburdin
2024-09-24 22:45:17 +02:00
committed by GitHub
parent bc69a3e877
commit 2179baa50c
25 changed files with 937 additions and 282 deletions

View File

@@ -49,7 +49,7 @@ void mergeSort(BinIdxType* begin, BinIdxType* end, BinIdxType* buf) {
}
template <typename BinIdxType>
void GHistIndexMatrix::SetIndexData(::sycl::queue qu,
void GHistIndexMatrix::SetIndexData(::sycl::queue* qu,
BinIdxType* index_data,
const DeviceMatrix &dmat,
size_t nbins,
@@ -66,11 +66,11 @@ void GHistIndexMatrix::SetIndexData(::sycl::queue qu,
// Sparse case only
if (!offsets) {
// sort_buff has type uint8_t
sort_buff.Resize(&qu, num_rows * row_stride * sizeof(BinIdxType));
sort_buff.Resize(qu, num_rows * row_stride * sizeof(BinIdxType));
}
BinIdxType* sort_data = reinterpret_cast<BinIdxType*>(sort_buff.Data());
auto event = qu.submit([&](::sycl::handler& cgh) {
auto event = qu->submit([&](::sycl::handler& cgh) {
cgh.parallel_for<>(::sycl::range<1>(num_rows), [=](::sycl::item<1> pid) {
const size_t i = pid.get_id(0);
const size_t ibegin = offset_vec[i];
@@ -92,8 +92,8 @@ void GHistIndexMatrix::SetIndexData(::sycl::queue qu,
}
});
});
qu.memcpy(hit_count.data(), hit_count_ptr, nbins * sizeof(size_t), event);
qu.wait();
qu->memcpy(hit_count.data(), hit_count_ptr, nbins * sizeof(size_t), event);
qu->wait();
}
void GHistIndexMatrix::ResizeIndex(size_t n_index, bool isDense) {
@@ -110,7 +110,7 @@ void GHistIndexMatrix::ResizeIndex(size_t n_index, bool isDense) {
}
}
void GHistIndexMatrix::Init(::sycl::queue qu,
void GHistIndexMatrix::Init(::sycl::queue* qu,
Context const * ctx,
const DeviceMatrix& p_fmat_device,
int max_bins) {
@@ -123,7 +123,7 @@ void GHistIndexMatrix::Init(::sycl::queue qu,
const uint32_t nbins = cut.Ptrs().back();
this->nbins = nbins;
hit_count.resize(nbins, 0);
hit_count_buff.Resize(&qu, nbins, 0);
hit_count_buff.Resize(qu, nbins, 0);
this->p_fmat = p_fmat_device.p_mat;
const bool isDense = p_fmat_device.p_mat->IsDense();
@@ -150,7 +150,7 @@ void GHistIndexMatrix::Init(::sycl::queue qu,
if (isDense) {
index.ResizeOffset(n_offsets);
offsets = index.Offset();
qu.memcpy(offsets, cut_device.Ptrs().DataConst(),
qu->memcpy(offsets, cut_device.Ptrs().DataConst(),
sizeof(uint32_t) * n_offsets).wait_and_throw();
}

View File

@@ -26,16 +26,16 @@ class HistogramCuts {
public:
HistogramCuts() {}
explicit HistogramCuts(::sycl::queue qu) {}
explicit HistogramCuts(::sycl::queue* qu) {}
~HistogramCuts() {
}
void Init(::sycl::queue qu, xgboost::common::HistogramCuts const& cuts) {
void Init(::sycl::queue* qu, xgboost::common::HistogramCuts const& cuts) {
qu_ = qu;
cut_values_.Init(&qu_, cuts.cut_values_.HostVector());
cut_ptrs_.Init(&qu_, cuts.cut_ptrs_.HostVector());
min_vals_.Init(&qu_, cuts.min_vals_.HostVector());
cut_values_.Init(qu_, cuts.cut_values_.HostVector());
cut_ptrs_.Init(qu_, cuts.cut_ptrs_.HostVector());
min_vals_.Init(qu_, cuts.min_vals_.HostVector());
}
// Getters for USM buffers to pass pointers into device kernels
@@ -47,7 +47,7 @@ class HistogramCuts {
USMVector<bst_float> cut_values_;
USMVector<uint32_t> cut_ptrs_;
USMVector<float> min_vals_;
::sycl::queue qu_;
::sycl::queue* qu_;
};
using BinTypeSize = ::xgboost::common::BinTypeSize;
@@ -115,11 +115,11 @@ struct Index {
}
void Resize(const size_t nBytesData) {
data_.Resize(&qu_, nBytesData);
data_.Resize(qu_, nBytesData);
}
void ResizeOffset(const size_t nDisps) {
offset_.Resize(&qu_, nDisps);
offset_.Resize(qu_, nDisps);
p_ = nDisps;
}
@@ -131,7 +131,7 @@ struct Index {
return data_.End();
}
void setQueue(::sycl::queue qu) {
void setQueue(::sycl::queue* qu) {
qu_ = qu;
}
@@ -155,7 +155,7 @@ struct Index {
size_t p_ {1};
Func func_;
::sycl::queue qu_;
::sycl::queue* qu_;
};
/*!
@@ -182,11 +182,11 @@ struct GHistIndexMatrix {
size_t row_stride;
// Create a global histogram matrix based on a given DMatrix device wrapper
void Init(::sycl::queue qu, Context const * ctx,
void Init(::sycl::queue* qu, Context const * ctx,
const sycl::DeviceMatrix& p_fmat_device, int max_num_bins);
template <typename BinIdxType>
void SetIndexData(::sycl::queue qu, BinIdxType* index_data,
void SetIndexData(::sycl::queue* qu, BinIdxType* index_data,
const sycl::DeviceMatrix &dmat_device,
size_t nbins, size_t row_stride, uint32_t* offsets);