Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-09-17 08:54:12

0001 /*
0002  * SPDX-PackageName: "covfie, a part of the ACTS project"
0003  * SPDX-FileCopyrightText: 2022 CERN
0004  * SPDX-License-Identifier: MPL-2.0
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 }