MUDA
Loading...
Searching...
No Matches
field_entry_viewer.h
1#pragma once
2#include <muda/viewer/viewer_base.h>
3#include <muda/ext/field/field_entry_layout.h>
4#include <muda/ext/field/field_entry_base_data.h>
5#include <muda/ext/field/field_entry_core.h>
6#include <muda/ext/field/matrix_map_info.h>
7#include <muda/tools/host_device_config.h>
8#include <muda/ext/eigen/eigen_core_cxx20.h>
9
10namespace muda
11{
12namespace details::field
13{
14 using MatStride = Eigen::Stride<Eigen::Dynamic, Eigen::Dynamic>;
15 template <typename T, FieldEntryLayout Layout, int M, int N>
16 MUDA_GENERIC MatStride make_stride(const FieldEntryCore& core)
17 {
18 MatStride ret;
19 if constexpr(M == 1 && N == 1)
20 {
21 ret = MatStride{0, 0};
22 }
23 else if constexpr(N == 1) // vector
24 {
25 auto begin = core.data<T, Layout>(0, 0);
26 auto next = core.data<T, Layout>(0, 1);
27 ret = MatStride{0, next - begin};
28 }
29 else // matrix
30 {
31 auto begin = core.data<T, Layout>(0, 0, 0);
32 auto inner_next = core.data<T, Layout>(0, 1, 0);
33 auto outer_next = core.data<T, Layout>(0, 0, 1);
34 ret = MatStride{outer_next - begin, inner_next - begin};
35 }
36 return ret;
37 }
38} // namespace details::field
39
40template <bool IsConst, typename T, FieldEntryLayout Layout, int M, int N>
41class FieldEntryViewerCore : protected ViewerBase<IsConst>
42{
44
45 public:
46 using MatStride = details::field::MatStride;
47
48 using ConstMatMap = Eigen::Map<const Eigen::Matrix<T, M, N>, 0, MatStride>;
49 using NonConstMatMap = Eigen::Map<Eigen::Matrix<T, M, N>, 0, MatStride>;
50 using ThisMatMap = std::conditional_t<IsConst, ConstMatMap, NonConstMatMap>;
51
52 protected:
53 template <typename U>
54 using auto_const_t = typename Base::template auto_const_t<U>;
55
57 MatStride m_stride;
58 int m_offset = 0;
59 int m_size = 0;
60
61 public:
62 MUDA_GENERIC FieldEntryViewerCore() {}
63
64 MUDA_GENERIC FieldEntryViewerCore(HostDeviceConfigView<FieldEntryCore> core, int offset, int size)
65 : m_core(core)
66 , m_offset(offset)
67 , m_size(size)
68 {
69 Base::name(core->name_string_pointer());
70
71 MUDA_KERNEL_ASSERT(m_offset >= 0 && m_size >= 0 && m_offset + m_size <= total_count(),
72 "FieldEntryViewer[%s:%s]: offset/size indexing out of range, size=%d, offset=%d, size=%d",
73 this->name(),
74 this->kernel_name(),
75 this->total_count(),
76 m_offset,
77 m_size);
78
79 m_stride = details::field::make_stride<T, Layout, M, N>(*m_core);
80 }
81
82 MUDA_GENERIC FieldEntryViewerCore(const FieldEntryViewerCore&) = default;
83
84 // here we don't care about the const/non-const T* access
85 // we will impl that in the derived class
86 MUDA_GENERIC T* data(int i) const
87 {
88 check_index(i);
89 return m_core->template data<T, Layout>(m_offset + i);
90 }
91
92 MUDA_GENERIC T* data(int i, int j) const
93 {
94 check_index(i);
95
96 MUDA_KERNEL_ASSERT(j < shape().x,
97 "FieldEntry[%s:%s]: vector component indexing out of range, shape=(%d, %d), index=%d",
98 this->name(),
99 this->kernel_name(),
100 shape().x,
101 shape().y,
102 j);
103 return m_core->template data<T, Layout>(m_offset + i, j);
104 }
105
106 MUDA_GENERIC T* data(int i, int row_index, int col_index) const
107 {
108 check_index(i);
109
110 MUDA_KERNEL_ASSERT(row_index < shape().x && col_index < shape().y,
111 "FieldEntry[%s:%s]: vector component indexing out of range, shape=(%d,%d), index=(%d,%d)",
112 this->name(),
113 this->kernel_name(),
114 shape().x,
115 shape().y,
116 row_index,
117 col_index);
118 return m_core->template data<T, Layout>(m_offset + i, row_index, col_index);
119 }
120
121 public:
122 MUDA_GENERIC auto layout_info() const { return m_core->layout_info(); }
123 MUDA_GENERIC auto layout() const { return m_core->layout(); }
124 MUDA_GENERIC auto offset() const { return m_offset; }
125 MUDA_GENERIC auto size() const { return m_size; }
126 MUDA_GENERIC auto total_count() const { return m_core->count(); }
127 MUDA_GENERIC auto elem_byte_size() const
128 {
129 return m_core->elem_byte_size();
130 }
131 MUDA_GENERIC auto shape() const { return m_core->shape(); }
132 MUDA_GENERIC auto struct_stride() const { return m_core->struct_stride(); }
133 MUDA_GENERIC auto entry_name() const { return m_core->name(); }
134
135 private:
136 MUDA_INLINE MUDA_GENERIC void check_index(int i) const
137 {
138 MUDA_KERNEL_ASSERT(i < m_size,
139 "FieldEntryViewer[%s:%s]: indexing out of range, index=%d, size=%d, offset=%d, entry_total_count=%d",
140 this->name(),
141 this->kernel_name(),
142 i,
143 m_size,
144 m_offset,
145 this->total_count());
146 }
147};
148} // namespace muda
149
150
151namespace muda
152{
153// forward declaration
154template <bool IsConst, typename T, FieldEntryLayout Layout, int M, int N>
155class FieldEntryViewerBase;
156template <typename T, FieldEntryLayout Layout, int M, int N>
157class FieldEntryViewer;
158template <typename T, FieldEntryLayout Layout, int M, int N>
159class CFieldEntryViewer;
160} // namespace muda
161
162// implementation
163#include "details/entry_viewers/field_entry_viewer_matrix.inl"
164#include "details/entry_viewers/field_entry_viewer_vector.inl"
165#include "details/entry_viewers/field_entry_viewer_scalar.inl"
Definition field_entry_viewer.h:42
Definition host_device_config.h:12
Definition viewer_base.h:18