File indexing completed on 2025-09-17 08:54:12
0001
0002
0003
0004
0005
0006
0007 #pragma once
0008
0009 #include <cuda_runtime.h>
0010
0011 #include <covfie/core/concepts.hpp>
0012
0013 #include "covfie/core/parameter_pack.hpp"
0014
0015 namespace covfie::utility::cuda {
0016 template <typename T, typename U>
0017 requires(concepts::field_backend<T> &&
0018 concepts::field_backend<typename std::decay_t<U>::parent_t>)
0019 typename T::owning_data_t
0020 copy_backend_with_stream(U && backend, const cudaStream_t & stream)
0021 {
0022 constexpr bool can_construct_with_stream = std::
0023 constructible_from<typename T::owning_data_t, U, const cudaStream_t &>;
0024
0025 static_assert(
0026 can_construct_with_stream ||
0027 (!std::decay_t<T>::is_initial && !std::decay_t<U>::parent_t::is_initial)
0028 );
0029
0030 if constexpr (can_construct_with_stream) {
0031 return typename T::owning_data_t(std::forward<U>(backend), stream);
0032 } else if constexpr (std::constructible_from<
0033 typename T::owning_data_t,
0034 decltype(backend.get_configuration()),
0035 typename T::backend_t::owning_data_t &&>)
0036 {
0037 return typename T::owning_data_t(
0038 backend.get_configuration(),
0039 copy_backend_with_stream<typename T::backend_t>(
0040 backend.get_backend(), stream
0041 )
0042 );
0043 } else {
0044 return typename T::owning_data_t(make_parameter_pack(
0045 backend.get_configuration(),
0046 copy_backend_with_stream<typename T::backend_t>(
0047 backend.get_backend(), stream
0048 )
0049 ));
0050 }
0051 }
0052
0053 template <typename T, typename U>
0054 requires(concepts::field_backend<typename T::backend_t> &&
0055 concepts::field_backend<typename std::decay_t<U>::backend_t>) T
0056 copy_field_with_stream(U && field, const cudaStream_t & stream)
0057 {
0058 return T(
0059 copy_backend_with_stream<typename T::backend_t>(field.backend(), stream)
0060 );
0061 }
0062 }