Arcane  v4.1.2.0
Documentation développeur
Chargement...
Recherche...
Aucune correspondance
CommonUtils.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2025 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* CommonUtils.cc (C) 2000-2025 */
9/* */
10/* Fonctions/Classes utilitaires communes à tout les runtimes. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arccore/accelerator/CommonUtils.h"
15
16#include "arccore/base/FatalErrorException.h"
17
19#include "arccore/common/accelerator/NativeStream.h"
20
21/*---------------------------------------------------------------------------*/
22/*---------------------------------------------------------------------------*/
23
29
30/*---------------------------------------------------------------------------*/
31/*---------------------------------------------------------------------------*/
32
33namespace Arcane::Accelerator::Impl
34{
35
36/*---------------------------------------------------------------------------*/
37/*---------------------------------------------------------------------------*/
38
39#if defined(ARCCORE_COMPILING_CUDA)
40
41cudaStream_t CudaUtils::
42toNativeStream(const NativeStream& v)
43{
44 cudaStream_t* s = reinterpret_cast<cudaStream_t*>(v.m_native_pointer);
45 if (!s)
46 ARCCORE_FATAL("Null CUDA stream");
47 return *s;
48}
49
50cudaStream_t CudaUtils::
51toNativeStream(const RunQueue* queue)
52{
54 if (queue)
55 p = queue->executionPolicy();
57 ARCCORE_FATAL("RunQueue is not a CUDA queue");
58 return toNativeStream(queue->_internalNativeStream());
59}
60
61cudaStream_t CudaUtils::
62toNativeStream(const RunQueue& queue)
63{
64 return toNativeStream(&queue);
65}
66
67#endif
68
69/*---------------------------------------------------------------------------*/
70/*---------------------------------------------------------------------------*/
71
72#if defined(ARCCORE_COMPILING_HIP)
73
74hipStream_t HipUtils::
75toNativeStream(const NativeStream& v)
76{
77 hipStream_t* s = reinterpret_cast<hipStream_t*>(v.m_native_pointer);
78 if (!s)
79 ARCCORE_FATAL("Null HIP stream");
80 return *s;
81}
82
83hipStream_t HipUtils::
84toNativeStream(const RunQueue* queue)
85{
87 if (queue)
88 p = queue->executionPolicy();
89 if (p != eExecutionPolicy::HIP)
90 ARCCORE_FATAL("RunQueue is not a HIP queue");
91 return toNativeStream(queue->_internalNativeStream());
92}
93
94hipStream_t HipUtils::
95toNativeStream(const RunQueue& queue)
96{
97 return toNativeStream(&queue);
98}
99
100#endif
101
102/*---------------------------------------------------------------------------*/
103/*---------------------------------------------------------------------------*/
104
105#if defined(ARCCORE_COMPILING_SYCL)
106
107sycl::queue SyclUtils::
108toNativeStream(const NativeStream& v)
109{
110 sycl::queue* s = reinterpret_cast<sycl::queue*>(v.m_native_pointer);
111 if (!s)
112 ARCCORE_FATAL("Null SYCL stream");
113 return *s;
114}
115
116sycl::queue SyclUtils::
117toNativeStream(const RunQueue* queue)
118{
120 if (queue)
121 p = queue->executionPolicy();
122 if (p != eExecutionPolicy::SYCL)
123 ARCCORE_FATAL("RunQueue is not a SYCL queue");
124 return toNativeStream(queue->_internalNativeStream());
125}
126
127sycl::queue SyclUtils::
128toNativeStream(const RunQueue& queue)
129{
130 return toNativeStream(&queue);
131}
132
133#endif
134
135/*---------------------------------------------------------------------------*/
136/*---------------------------------------------------------------------------*/
137
138} // namespace Arcane::Accelerator::Impl
139
140/*---------------------------------------------------------------------------*/
141/*---------------------------------------------------------------------------*/
142
143namespace Arcane::Accelerator::impl
144{
145
146/*---------------------------------------------------------------------------*/
147/*---------------------------------------------------------------------------*/
148
150_copyToAsync(Span<std::byte> destination, Span<const std::byte> source, const RunQueue& queue)
151{
152#if defined(ARCCORE_COMPILING_CUDA)
153 cudaStream_t stream = Impl::CudaUtils::toNativeStream(queue);
154 ARCANE_CHECK_CUDA(::cudaMemcpyAsync(destination.data(), source.data(), source.size(), cudaMemcpyDeviceToHost, stream));
155#elif defined(ARCCORE_COMPILING_HIP)
156 hipStream_t stream = Impl::HipUtils::toNativeStream(queue);
157 ARCANE_CHECK_HIP(::hipMemcpyAsync(destination.data(), source.data(), source.size(), hipMemcpyDefault, stream));
158#else
159 ARCCORE_UNUSED(destination);
160 ARCCORE_UNUSED(source);
161 ARCCORE_UNUSED(queue);
162 ARCCORE_FATAL("No valid implementation for copy");
163#endif
164}
165
166/*---------------------------------------------------------------------------*/
167/*---------------------------------------------------------------------------*/
168
169GenericDeviceStorage::
170GenericDeviceStorage()
171: m_storage(MemoryUtils::getDeviceOrHostAllocator())
172{
173}
174
175/*---------------------------------------------------------------------------*/
176/*---------------------------------------------------------------------------*/
177
178} // namespace Arcane::Accelerator::impl
179
180/*---------------------------------------------------------------------------*/
181/*---------------------------------------------------------------------------*/
#define ARCCORE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Fonctions utilitaires de gestion mémoire.
void _copyToAsync(Span< std::byte > destination, Span< const std::byte > source, const RunQueue &queue)
Copie l'instance dans dest_ptr.
constexpr __host__ __device__ pointer data() const noexcept
Pointeur sur le début de la vue.
Definition Span.h:537
Vue d'un tableau d'éléments de type T.
Definition Span.h:633
eExecutionPolicy
Politique d'exécution pour un Runner.
@ SYCL
Politique d'exécution utilisant l'environnement SYCL.
@ HIP
Politique d'exécution utilisant l'environnement HIP.
@ CUDA
Politique d'exécution utilisant l'environnement CUDA.
Fonctions utilitaires de gestion mémoire.