Arcane  v3.15.0.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
CommonUtils.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2024 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-2024 */
9/* */
10/* Fonctions/Classes utilitaires communes à tout les runtimes. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/accelerator/CommonUtils.h"
15
16#include "arcane/utils/FatalErrorException.h"
18
19#include "arcane/accelerator/core/NativeStream.h"
20#include "arcane/accelerator/CommonUtils.h"
21
22/*---------------------------------------------------------------------------*/
23/*---------------------------------------------------------------------------*/
24
25/*!
26 * \namespace Arcane::Accelerator::AcceleratorUtils
27 *
28 * \brief Espace de nom pour les méthodes utilitaires des accélérateurs.
29 */
30
31/*---------------------------------------------------------------------------*/
32/*---------------------------------------------------------------------------*/
33
34namespace Arcane::Accelerator::impl
35{
36
37/*---------------------------------------------------------------------------*/
38/*---------------------------------------------------------------------------*/
39
40#if defined(ARCANE_COMPILING_CUDA)
41
42cudaStream_t CudaUtils::
43toNativeStream(const NativeStream& v)
44{
45 cudaStream_t* s = reinterpret_cast<cudaStream_t*>(v.m_native_pointer);
46 if (!s)
47 ARCANE_FATAL("Null CUDA stream");
48 return *s;
49}
50
51cudaStream_t CudaUtils::
52toNativeStream(const RunQueue* queue)
53{
55 if (queue)
56 p = queue->executionPolicy();
58 ARCANE_FATAL("RunQueue is not a CUDA queue");
59 return toNativeStream(queue->_internalNativeStream());
60}
61
62cudaStream_t CudaUtils::
63toNativeStream(const RunQueue& queue)
64{
65 return toNativeStream(&queue);
66}
67
68#endif
69
70/*---------------------------------------------------------------------------*/
71/*---------------------------------------------------------------------------*/
72
73#if defined(ARCANE_COMPILING_HIP)
74
75hipStream_t HipUtils::
76toNativeStream(const NativeStream& v)
77{
78 hipStream_t* s = reinterpret_cast<hipStream_t*>(v.m_native_pointer);
79 if (!s)
80 ARCANE_FATAL("Null HIP stream");
81 return *s;
82}
83
84hipStream_t HipUtils::
85toNativeStream(const RunQueue* queue)
86{
88 if (queue)
89 p = queue->executionPolicy();
90 if (p != eExecutionPolicy::HIP)
91 ARCANE_FATAL("RunQueue is not a HIP queue");
92 return toNativeStream(queue->_internalNativeStream());
93}
94
95hipStream_t HipUtils::
96toNativeStream(const RunQueue& queue)
97{
98 return toNativeStream(&queue);
99}
100
101#endif
102
103/*---------------------------------------------------------------------------*/
104/*---------------------------------------------------------------------------*/
105
106#if defined(ARCANE_COMPILING_SYCL)
107
108sycl::queue SyclUtils::
109toNativeStream(const NativeStream& v)
110{
111 sycl::queue* s = reinterpret_cast<sycl::queue*>(v.m_native_pointer);
112 if (!s)
113 ARCANE_FATAL("Null SYCL stream");
114 return *s;
115}
116
117sycl::queue SyclUtils::
118toNativeStream(const RunQueue* queue)
119{
121 if (queue)
122 p = queue->executionPolicy();
123 if (p != eExecutionPolicy::SYCL)
124 ARCANE_FATAL("RunQueue is not a SYCL queue");
125 return toNativeStream(queue->_internalNativeStream());
126}
127
128sycl::queue SyclUtils::
129toNativeStream(const RunQueue& queue)
130{
131 return toNativeStream(&queue);
132}
133
134#endif
135
136/*---------------------------------------------------------------------------*/
137/*---------------------------------------------------------------------------*/
138
140_copyToAsync(Span<std::byte> destination, Span<const std::byte> source, const RunQueue& queue)
141{
142#if defined(ARCANE_COMPILING_CUDA)
143 cudaStream_t stream = CudaUtils::toNativeStream(queue);
144 ARCANE_CHECK_CUDA(::cudaMemcpyAsync(destination.data(), source.data(), source.size(), cudaMemcpyDeviceToHost, stream));
145#elif defined(ARCANE_COMPILING_HIP)
146 hipStream_t stream = HipUtils::toNativeStream(queue);
147 ARCANE_CHECK_HIP(::hipMemcpyAsync(destination.data(), source.data(), source.size(), hipMemcpyDefault, stream));
148#else
149 ARCANE_UNUSED(destination);
150 ARCANE_UNUSED(source);
151 ARCANE_UNUSED(queue);
152 ARCANE_FATAL("No valid implementation for copy");
153#endif
154}
155
156/*---------------------------------------------------------------------------*/
157/*---------------------------------------------------------------------------*/
158
159GenericDeviceStorage::
160GenericDeviceStorage()
161: m_storage(MemoryUtils::getDeviceOrHostAllocator())
162{
163}
164
165/*---------------------------------------------------------------------------*/
166/*---------------------------------------------------------------------------*/
167
168} // namespace Arcane::Accelerator::impl
169
170/*---------------------------------------------------------------------------*/
171/*---------------------------------------------------------------------------*/
#define ARCANE_FATAL(...)
Macro envoyant une exception FatalErrorException.
Fonctions de gestion mémoire et des allocateurs.
File d'exécution pour un accélérateur.
void _copyToAsync(Span< std::byte > destination, Span< const std::byte > source, const RunQueue &queue)
Copie l'instance dans dest_ptr.
constexpr __host__ __device__ SizeType size() const noexcept
Retourne la taille du tableau.
Definition Span.h:209
constexpr __host__ __device__ pointer data() const noexcept
Pointeur sur le début de la vue.
Definition Span.h:419
Vue d'un tableau d'éléments de type T.
Definition Span.h:510
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.
@ None
Aucune politique d'exécution.
@ CUDA
Politique d'exécution utilisant l'environnement CUDA.