File: sycl_helpers.h

package info (click to toggle)
xgboost 3.0.0-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 13,796 kB
  • sloc: cpp: 67,502; python: 35,503; java: 4,676; ansic: 1,426; sh: 1,320; xml: 1,197; makefile: 204; javascript: 19
file content (59 lines) | stat: -rw-r--r-- 1,848 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/*!
 * Copyright 2022-2024 XGBoost contributors
 */
#pragma once

#include "../helpers.h"
#include "../../plugin/sycl/device_manager.h"
#include "../../plugin/sycl/data.h"

namespace xgboost::sycl {

template<typename T, typename Fn>
void TransformOnDeviceData(DeviceOrd device, T* device_data, size_t n_data, Fn&& fn) {
  sycl::DeviceManager device_manager;
  ::sycl::queue* qu = device_manager.GetQueue(device);

  qu->submit([&](::sycl::handler& cgh) {
    cgh.parallel_for<>(::sycl::range<1>(n_data), [=](::sycl::item<1> nid) {
      const size_t i = nid.get_id(0);
      device_data[i] = fn(device_data[i]);
    });
  }).wait();
}

template<typename T>
void VerifyOnDeviceData(DeviceOrd device, const T* device_data, const T* host_data, size_t n_data, T eps = T()) {
  sycl::DeviceManager device_manager;
  ::sycl::queue* qu = device_manager.GetQueue(device);

  std::vector<T> copy_device_data(n_data);
  qu->memcpy(copy_device_data.data(), device_data, n_data * sizeof(T)).wait();
  for (size_t i = 0; i < n_data; ++i) {
    EXPECT_NEAR(copy_device_data[i], host_data[i], eps);
  }
}

template<typename T, typename Container>
void VerifySyclVector(const USMVector<T, MemoryType::shared>& sycl_vector,
                      const Container& host_vector, T eps = T()) {
  ASSERT_EQ(sycl_vector.Size(), host_vector.size());

  size_t size = sycl_vector.Size();
  for (size_t i = 0; i < size; ++i) {
    EXPECT_NEAR(sycl_vector[i], host_vector[i], eps);
  }
}

template<typename T, typename Container>
void VerifySyclVector(const std::vector<T>& sycl_vector,
                      const Container& host_vector, T eps = T()) {
  ASSERT_EQ(sycl_vector.size(), host_vector.size());

  size_t size = sycl_vector.size();
  for (size_t i = 0; i < size; ++i) {
    EXPECT_NEAR(sycl_vector[i], host_vector[i], eps);
  }
}

}  // namespace xgboost::sycl