MUDA
Loading...
Searching...
No Matches
field_entry_launch.inl
1namespace muda
2{
3//using T = float;
4//constexpr auto M = 3;
5//constexpr auto N = 3;
6//constexpr auto DstLayout = FieldEntryLayout::RuntimeLayout;
7//constexpr auto SrcLayout = FieldEntryLayout::RuntimeLayout;
8
9template <typename T, FieldEntryLayout DstLayout, FieldEntryLayout SrcLayout, int M, int N>
10MUDA_HOST FieldEntryLaunch& FieldEntryLaunch::copy(FieldEntryView<T, DstLayout, M, N> dst,
11 CFieldEntryView<T, SrcLayout, M, N> src)
12{
13 MUDA_ASSERT(dst.size() == src.size(),
14 "FieldEntry size mismatching: dst.size() = %d, src.size() = %d",
15 dst.size(),
16 src.size());
17
18 ParallelFor() //
19 .apply(dst.size(),
20 [dst, src] __device__(int i) mutable
21 {
22 if constexpr(M == 1 && N == 1)
23 {
24 *dst.data(i) = *src.data(i);
25 }
26 else if constexpr(M > 1 && N == 1)
27 {
28#pragma unroll
29 for(int j = 0; j < M; ++j)
30 {
31 *dst.data(i, j) = *src.data(i, j);
32 }
33 }
34 else if constexpr(M > 1 && N > 1)
35 {
36#pragma unroll
37 for(int j = 0; j < M; ++j)
38 {
39#pragma unroll
40 for(int k = 0; k < N; ++k)
41 {
42 *dst.data(i, j, k) = *src.data(i, j, k);
43 }
44 }
45 }
46 else
47 {
48 static_assert("Invalid");
49 }
50 });
51 return *this;
52}
53
54
55template <typename T, FieldEntryLayout DstLayout, int M, int N>
56MUDA_HOST FieldEntryLaunch& FieldEntryLaunch::fill(
57 FieldEntryView<T, DstLayout, M, N> dst,
58 const typename FieldEntryView<T, DstLayout, M, N>::ElementType& value)
59{
60 ParallelFor() //
61 .apply(dst.size(),
62 [dst, value] __device__(int i) mutable
63 {
64 if constexpr(M == 1 && N == 1)
65 {
66 *dst.data(i) = value;
67 }
68 else if constexpr(M > 1 && N == 1)
69 {
70
71#pragma unroll
72 for(int j = 0; j < M; ++j)
73 {
74 *dst.data(i, j) = value(j);
75 }
76 }
77 else if constexpr(M > 1 && N > 1)
78 {
79#pragma unroll
80 for(int j = 0; j < M; ++j)
81 {
82#pragma unroll
83 for(int k = 0; k < N; ++k)
84 {
85 *dst.data(i, j, k) = value(j, k);
86 }
87 }
88 }
89 else
90 {
91 static_assert("Invalid");
92 }
93 });
94
95 return *this;
96}
97
98template <typename T, FieldEntryLayout SrcLayout, int M, int N>
99MUDA_HOST FieldEntryLaunch& FieldEntryLaunch::copy(
100 BufferView<typename CFieldEntryView<T, SrcLayout, M, N>::ElementType> dst,
101 CFieldEntryView<T, SrcLayout, M, N> src)
102{
103 MUDA_ASSERT(dst.size() == src.size(),
104 "FieldEntry size mismatching: dst.size() = %d, src.size() = %d",
105 dst.size(),
106 src.size());
107
108
109 ParallelFor() //
110 .apply(dst.size(),
111 [dst, src] __device__(int i) mutable
112 {
113 if constexpr(M == 1 && N == 1)
114 {
115 *dst.data(i) = *src.data(i);
116 }
117 else if constexpr(M > 1 && N == 1)
118 {
119#pragma unroll
120 for(int j = 0; j < M; ++j)
121 {
122 (*dst.data(i))(j) = *src.data(i, j);
123 }
124 }
125 else if constexpr(M > 1 && N > 1)
126 {
127#pragma unroll
128 for(int j = 0; j < M; ++j)
129 {
130#pragma unroll
131 for(int k = 0; k < N; ++k)
132 {
133 (*dst.data(i))(j, k) = *src.data(i, j, k);
134 }
135 }
136 }
137 else
138 {
139 static_assert("Invalid");
140 }
141 });
142
143 return *this;
144}
145
146template <typename T, FieldEntryLayout DstLayout, int M, int N>
147MUDA_HOST FieldEntryLaunch& FieldEntryLaunch::copy(
148 FieldEntryView<T, DstLayout, M, N> dst,
149 CBufferView<typename FieldEntryView<T, DstLayout, M, N>::ElementType> src)
150{
151 MUDA_ASSERT(dst.size() == src.size(),
152 "FieldEntry size mismatching: dst.size() = %d, src.size() = %d",
153 dst.size(),
154 src.size());
155
156 ParallelFor().apply(dst.size(),
157 [dst = dst, src = src] __device__(int i) mutable
158 {
159 if constexpr(M == 1 && N == 1)
160 {
161 *dst.data(i) = (*src.data(i));
162 }
163 else if constexpr(M > 1 && N == 1)
164 {
165#pragma unroll
166
167 for(int j = 0; j < M; ++j)
168 {
169 *dst.data(i, j) = (*src.data(i))(j);
170 }
171 }
172 else if constexpr(M > 1 && N > 1)
173 {
174#pragma unroll
175 for(int j = 0; j < M; ++j)
176 {
177#pragma unroll
178 for(int k = 0; k < N; ++k)
179 {
180 *dst.data(i, j, k) = (*src.data(i))(j, k);
181 }
182 }
183 }
184 else
185 {
186 static_assert("Invalid");
187 }
188 });
189
190 return *this;
191}
192} // namespace muda