Skip to content

Commit 051cb90

Browse files
authored
Merge pull request #2980 from danhoeflinger/dev/dhoeflin/indirectly_device_accessible
Use indirectly_device_accessible not "is_passed_directly"
2 parents a6a4351 + 7f447f5 commit 051cb90

3 files changed

Lines changed: 29 additions & 12 deletions

File tree

clang/runtime/dpct-rt/include/dpct/dpl_extras/iterator_adaptor.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,12 @@ class iterator_adaptor
3636
public:
3737
// It is the user's responsibility to ensure extra data is available on the
3838
// device if they want to use this iterator with device execution policies
39-
using is_passed_directly = ::std::true_type;
39+
// TODO: consider deferring this indirectly device accessible check to the
40+
// base iterator, rather than returning true
41+
friend auto is_onedpl_indirectly_device_accessible(iterator_adaptor)
42+
-> ::std::true_type {
43+
return {};
44+
}
4045
using iterator_category = ::std::random_access_iterator_tag;
4146

4247
iterator_adaptor() {}

clang/runtime/dpct-rt/include/dpct/dpl_extras/iterators.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,10 @@ oneapi::dpl::counting_iterator<T> make_counting_iterator(const T &input) {
7878
template <typename _Tp> class constant_iterator {
7979
public:
8080
typedef std::false_type is_hetero;
81-
typedef std::true_type is_passed_directly;
81+
friend auto is_onedpl_indirectly_device_accessible(constant_iterator)
82+
-> std::true_type {
83+
return {};
84+
}
8285
typedef std::ptrdiff_t difference_type;
8386
typedef _Tp value_type;
8487
typedef _Tp *pointer;

clang/runtime/dpct-rt/include/dpct/dpl_extras/memory.h

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,6 @@ class device_pointer<void, Mode, Allocator>
233233
using reference = value_type &;
234234
using iterator_category = std::random_access_iterator_tag;
235235
using is_hetero = std::true_type; // required
236-
using is_passed_directly = std::false_type;
237236
static constexpr sycl::access_mode mode = Mode; // required
238237

239238
device_pointer(sycl::buffer<value_type, 1> in, std::size_t i = 0)
@@ -280,7 +279,6 @@ class device_pointer
280279
using reference = T &;
281280
using iterator_category = std::random_access_iterator_tag;
282281
using is_hetero = std::true_type; // required
283-
using is_passed_directly = std::false_type;
284282
static constexpr sycl::access_mode mode = Mode; // required
285283

286284
device_pointer(sycl::buffer<T, 1> in, std::size_t i = 0) : base_type(in, i) {}
@@ -376,8 +374,11 @@ class device_pointer<void>
376374
using reference = value_type &;
377375
using const_reference = const value_type &;
378376
using iterator_category = std::random_access_iterator_tag;
379-
using is_hetero = std::false_type; // required
380-
using is_passed_directly = std::true_type; // required
377+
using is_hetero = std::false_type; // required
378+
friend auto is_onedpl_indirectly_device_accessible(device_pointer)
379+
-> std::true_type {
380+
return {};
381+
}
381382

382383
device_pointer(void *p) : base_type(static_cast<value_type *>(p)) {}
383384
// needed for malloc_device, count is number of bytes to allocate
@@ -420,8 +421,11 @@ class device_pointer : public device_pointer_base<T, device_pointer<T>> {
420421
using reference = T &;
421422
using const_reference = const T &;
422423
using iterator_category = std::random_access_iterator_tag;
423-
using is_hetero = std::false_type; // required
424-
using is_passed_directly = std::true_type; // required
424+
using is_hetero = std::false_type; // required
425+
friend auto is_onedpl_indirectly_device_accessible(device_pointer)
426+
-> std::true_type {
427+
return {};
428+
}
425429

426430
device_pointer(T *p) : base_type(p) {}
427431
// needed for malloc_device, count is number of bytes to allocate
@@ -469,7 +473,6 @@ class device_iterator : public device_pointer<T, Mode, Allocator> {
469473
using reference = T &;
470474
using iterator_category = std::random_access_iterator_tag;
471475
using is_hetero = std::true_type; // required
472-
using is_passed_directly = std::false_type; // required
473476
static constexpr sycl::access_mode mode = Mode; // required
474477

475478
device_iterator() : Base() {}
@@ -563,8 +566,11 @@ template <typename T> class device_iterator : public device_pointer<T> {
563566
using pointer = typename Base::pointer;
564567
using reference = typename Base::reference;
565568
using iterator_category = std::random_access_iterator_tag;
566-
using is_hetero = std::false_type; // required
567-
using is_passed_directly = std::true_type; // required
569+
using is_hetero = std::false_type; // required
570+
friend auto is_onedpl_indirectly_device_accessible(device_iterator)
571+
-> std::true_type {
572+
return {};
573+
}
568574
static constexpr sycl::access_mode mode =
569575
sycl::access_mode::read_write; // required
570576

@@ -730,7 +736,10 @@ template <typename T, typename Tag> class tagged_pointer {
730736
using reference = T &;
731737
using iterator_category = std::random_access_iterator_tag;
732738
using is_hetero = ::std::false_type;
733-
using is_passed_directly = std::true_type;
739+
friend auto is_onedpl_indirectly_device_accessible(tagged_pointer)
740+
-> std::true_type {
741+
return {};
742+
}
734743

735744
tagged_pointer() : m_ptr(nullptr) {}
736745
tagged_pointer(T *ptr) : m_ptr(ptr) {}

0 commit comments

Comments
 (0)