|
26 | 26 |
|
27 | 27 | #pragma once |
28 | 28 |
|
29 | | -#include <cstddef> |
30 | | -#include <exception> |
31 | | -#include <iostream> |
32 | | -#include <memory> |
33 | | -#include <stdexcept> |
34 | | -#include <type_traits> |
| 29 | +#include <cstddef> // for std::size_t |
| 30 | +#include <exception> // for std::exception |
| 31 | +#include <iostream> // for std::cerr |
| 32 | +#include <memory> // for std::unique_ptr |
| 33 | +#include <stdexcept> // for std::runtime_error |
| 34 | +#include <type_traits> // for std::true_type, std::false_type |
| 35 | +#include <utility> // for std::move |
35 | 36 | #include <vector> |
36 | 37 |
|
37 | 38 | #include "sycl/sycl.hpp" |
@@ -174,37 +175,38 @@ struct all_valid_smart_ptrs<Arg, RestArgs...> |
174 | 175 | }; |
175 | 176 | } // end of namespace detail |
176 | 177 |
|
177 | | -template <typename... Args> |
| 178 | +/*! @brief Submit host_task and transfer ownership from smart pointers to it */ |
| 179 | +template <typename... UniquePtrTs> |
178 | 180 | sycl::event async_smart_free(sycl::queue &exec_q, |
179 | 181 | const std::vector<sycl::event> &depends, |
180 | | - Args &&...args) |
| 182 | + UniquePtrTs &&...unique_pointers) |
181 | 183 | { |
182 | | - constexpr std::size_t n = sizeof...(Args); |
| 184 | + constexpr std::size_t n = sizeof...(UniquePtrTs); |
183 | 185 | static_assert( |
184 | 186 | n > 0, "async_smart_free requires at least one smart pointer argument"); |
185 | 187 |
|
186 | 188 | static_assert( |
187 | | - detail::all_valid_smart_ptrs<Args...>::value, |
| 189 | + detail::all_valid_smart_ptrs<UniquePtrTs...>::value, |
188 | 190 | "async_smart_free requires unique_ptr created with smart_malloc"); |
189 | 191 |
|
190 | 192 | std::vector<void *> ptrs; |
191 | 193 | ptrs.reserve(n); |
192 | | - (ptrs.push_back(reinterpret_cast<void *>(args.get())), ...); |
| 194 | + (ptrs.push_back(reinterpret_cast<void *>(unique_pointers.get())), ...); |
193 | 195 |
|
194 | 196 | std::vector<USMDeleter> dels; |
195 | 197 | dels.reserve(n); |
196 | | - (dels.push_back(args.get_deleter()), ...); |
| 198 | + (dels.emplace_back(unique_pointers.get_deleter()), ...); |
197 | 199 |
|
198 | 200 | sycl::event ht_e = exec_q.submit([&](sycl::handler &cgh) { |
199 | 201 | cgh.depends_on(depends); |
200 | 202 |
|
201 | | - cgh.host_task([ptrs, dels]() { |
| 203 | + cgh.host_task([ptrs = std::move(ptrs), dels = std::move(dels)]() { |
202 | 204 | for (std::size_t i = 0; i < ptrs.size(); ++i) { |
203 | 205 | dels[i](ptrs[i]); |
204 | 206 | } |
205 | 207 | }); |
206 | 208 | }); |
207 | | - (args.release(), ...); |
| 209 | + (unique_pointers.release(), ...); |
208 | 210 |
|
209 | 211 | return ht_e; |
210 | 212 | } |
|
0 commit comments