File indexing completed on 2026-07-26 08:22:12
0001
0002
0003
0004
0005
0006
0007
0008
0009 #pragma once
0010
0011
0012 #include "../utils/get_queue.hpp"
0013 #include "traccc/sycl/utils/queue_wrapper.hpp"
0014
0015
0016 #include <vecmem/memory/memory_resource.hpp>
0017 #include <vecmem/memory/unique_ptr.hpp>
0018 #include <vecmem/utils/copy.hpp>
0019
0020
0021 #include <sycl/sycl.hpp>
0022
0023
0024 #include <concepts>
0025
0026 namespace traccc::sycl {
0027
0028 namespace kernels {
0029
0030
0031
0032
0033
0034
0035 template <typename CONTAINER, typename R, typename VIEW>
0036 struct is_ordered_on {
0037
0038 is_ordered_on(R relation, VIEW view, bool* out)
0039 : m_relation(relation), m_view(view), m_out(out) {}
0040
0041
0042 void operator()(::sycl::nd_item<1> item) const {
0043 std::size_t tid = item.get_global_linear_id();
0044
0045 const CONTAINER in(m_view);
0046
0047 if (tid > 0 && tid < in.size()) {
0048 if (!m_relation(in.at(static_cast<CONTAINER::size_type>(tid - 1)),
0049 in.at(static_cast<CONTAINER::size_type>(tid)))) {
0050 *m_out = false;
0051 }
0052 }
0053 }
0054
0055
0056 R m_relation;
0057
0058 VIEW m_view;
0059
0060 bool* m_out;
0061 };
0062
0063 }
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089 template <typename CONTAINER, typename R, typename VIEW>
0090 requires std::regular_invocable<R, decltype(std::declval<CONTAINER>().at(0)),
0091 decltype(std::declval<CONTAINER>().at(0))> &&
0092 std::semiregular<R>
0093 bool is_ordered_on(R&& relation, vecmem::memory_resource& mr,
0094 const vecmem::copy& copy, ::sycl::queue& queue,
0095 const VIEW& view) {
0096
0097
0098 constexpr int block_size = 512;
0099
0100
0101 const typename VIEW::size_type n = copy.get_size(view);
0102
0103
0104 if (n == 0) {
0105 return true;
0106 }
0107
0108
0109 vecmem::unique_alloc_ptr<bool> out = vecmem::make_unique_alloc<bool>(mr);
0110 bool initial_out = true;
0111
0112 ::sycl::event kernel1_memcpy1 =
0113 queue.memcpy(out.get(), &initial_out, sizeof(bool));
0114
0115 ::sycl::nd_range<1> kernel_range{
0116 ::sycl::range<1>(((n + block_size - 1) / block_size) * block_size),
0117 ::sycl::range<1>(block_size)};
0118
0119 ::sycl::event kernel1 = queue.submit([&](::sycl::handler& h) {
0120 h.depends_on(kernel1_memcpy1);
0121 h.parallel_for<kernels::is_ordered_on<CONTAINER, R, VIEW>>(
0122 kernel_range,
0123 kernels::is_ordered_on<CONTAINER, R, VIEW>(relation, view, out.get()));
0124 });
0125
0126
0127 bool host_out;
0128
0129 queue.memcpy(&host_out, out.get(), sizeof(bool), {kernel1}).wait_and_throw();
0130
0131 return host_out;
0132 }
0133 }