|
15 | 15 |
|
16 | 16 | #include <alpaka/mem/view/Traits.hpp> |
17 | 17 | #include <alpaka/vec/Vec.hpp> |
18 | | -#include <cmath> |
19 | 18 | #include <concepts> |
20 | 19 | #include <cstdint> |
21 | 20 | #include <ranges> |
22 | | -#include <vector> |
23 | 21 |
|
24 | 22 | namespace clue { |
25 | 23 |
|
@@ -135,8 +133,8 @@ namespace clue { |
135 | 133 | PointsDevice& dev_points, |
136 | 134 | const Kernel& kernel, |
137 | 135 | std::size_t block_size) { |
138 | | - setupTiles(queue, dev_points); |
139 | | - setupFollowers(queue, dev_points.size()); |
| 136 | + detail::setup_tiles(queue, m_tiles, dev_points, m_pointsPerTile, m_wrappedCoordinates); |
| 137 | + detail::setup_followers(queue, m_followers, dev_points.size()); |
140 | 138 | alpaka::memset(queue, *m_seeds, 0x00); |
141 | 139 | make_clusters_impl(dev_points, kernel, queue, block_size); |
142 | 140 | alpaka::wait(queue); |
@@ -178,84 +176,6 @@ namespace clue { |
178 | 176 | m_tiles = *tile_buffer; |
179 | 177 | } |
180 | 178 |
|
181 | | - template <std::size_t Ndim> |
182 | | - void Clusterer<Ndim>::setupTiles(Queue& queue, const PointsHost& h_points) { |
183 | | - // TODO: reconsider the way that we compute the number of tiles |
184 | | - auto nTiles = |
185 | | - static_cast<int32_t>(std::ceil(h_points.size() / static_cast<float>(m_pointsPerTile))); |
186 | | - const auto nPerDim = static_cast<int32_t>(std::ceil(std::pow(nTiles, 1. / Ndim))); |
187 | | - nTiles = static_cast<int32_t>(std::pow(nPerDim, Ndim)); |
188 | | - |
189 | | - if (!m_tiles.has_value()) { |
190 | | - m_tiles = std::make_optional<TilesDevice>(queue, h_points.size(), nTiles); |
191 | | - } |
192 | | - // check if tiles are large enough for current data |
193 | | - if (!(m_tiles->extents().values >= static_cast<std::size_t>(h_points.size())) or |
194 | | - !(m_tiles->extents().keys >= static_cast<std::size_t>(nTiles))) { |
195 | | - m_tiles->initialize(h_points.size(), nTiles, nPerDim, queue); |
196 | | - } else { |
197 | | - m_tiles->reset(h_points.size(), nTiles, nPerDim); |
198 | | - } |
199 | | - |
200 | | - auto min_max = clue::make_host_buffer<CoordinateExtremes>(queue); |
201 | | - auto tile_sizes = clue::make_host_buffer<float[Ndim]>(queue); |
202 | | - detail::compute_tile_size(min_max.data(), tile_sizes.data(), h_points, nPerDim); |
203 | | - |
204 | | - alpaka::memcpy(queue, m_tiles->minMax(), min_max); |
205 | | - alpaka::memcpy(queue, m_tiles->tileSize(), tile_sizes); |
206 | | - alpaka::memcpy( |
207 | | - queue, m_tiles->wrapped(), clue::make_host_view(m_wrappedCoordinates.data(), Ndim)); |
208 | | - } |
209 | | - |
210 | | - template <std::size_t Ndim> |
211 | | - void Clusterer<Ndim>::setupTiles(Queue& queue, const PointsDevice& d_points) { |
212 | | - auto nTiles = |
213 | | - static_cast<int32_t>(std::ceil(d_points.size() / static_cast<float>(m_pointsPerTile))); |
214 | | - const auto nPerDim = static_cast<int32_t>(std::ceil(std::pow(nTiles, 1. / Ndim))); |
215 | | - nTiles = static_cast<int32_t>(std::pow(nPerDim, Ndim)); |
216 | | - |
217 | | - if (!m_tiles.has_value()) { |
218 | | - m_tiles = std::make_optional<TilesDevice>(queue, d_points.size(), nTiles); |
219 | | - } |
220 | | - // check if tiles are large enough for current data |
221 | | - if (!(m_tiles->extents().values >= static_cast<std::size_t>(d_points.size())) or |
222 | | - !(m_tiles->extents().keys >= static_cast<std::size_t>(nTiles))) { |
223 | | - m_tiles->initialize(d_points.size(), nTiles, nPerDim, queue); |
224 | | - } else { |
225 | | - m_tiles->reset(d_points.size(), nTiles, nPerDim); |
226 | | - } |
227 | | - |
228 | | - auto min_max = clue::make_host_buffer<CoordinateExtremes>(queue); |
229 | | - auto tile_sizes = clue::make_host_buffer<float[Ndim]>(queue); |
230 | | - detail::compute_tile_size(min_max.data(), tile_sizes.data(), d_points, nPerDim); |
231 | | - |
232 | | - alpaka::memcpy(queue, m_tiles->minMax(), min_max); |
233 | | - alpaka::memcpy(queue, m_tiles->tileSize(), tile_sizes); |
234 | | - alpaka::memcpy( |
235 | | - queue, m_tiles->wrapped(), clue::make_host_view(m_wrappedCoordinates.data(), Ndim)); |
236 | | - } |
237 | | - |
238 | | - template <std::size_t Ndim> |
239 | | - void Clusterer<Ndim>::setupFollowers(Queue& queue, int32_t n_points) { |
240 | | - if (!m_followers.has_value()) { |
241 | | - m_followers = std::make_optional<FollowersDevice>(n_points, queue); |
242 | | - } |
243 | | - |
244 | | - if (!(m_followers->extents() >= n_points)) { |
245 | | - m_followers->initialize(n_points, queue); |
246 | | - } else { |
247 | | - m_followers->reset(n_points); |
248 | | - } |
249 | | - } |
250 | | - |
251 | | - template <std::size_t Ndim> |
252 | | - void Clusterer<Ndim>::setupPoints(const PointsHost& h_points, |
253 | | - PointsDevice& dev_points, |
254 | | - Queue& queue) { |
255 | | - clue::copyToDevice(queue, dev_points, h_points); |
256 | | - alpaka::memset(queue, *m_seeds, 0x00); |
257 | | - } |
258 | | - |
259 | 179 | template <std::size_t Ndim> |
260 | 180 | template <concepts::convolutional_kernel Kernel> |
261 | 181 | void Clusterer<Ndim>::make_clusters_impl(PointsHost& h_points, |
|
0 commit comments