Alien  1.3.0
Developer documentation
Loading...
Searching...
No Matches
HCSRVector.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 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
9#include <alien/kernels/sycl/SYCLPrecomp.h>
10
11
12#include <alien/kernels/sycl/data/HCSRVectorInternal.h>
13
14namespace Alien {
15
16template <typename ValueT>
17typename HCSRVector<ValueT>::ValueType const*
18HCSRVector<ValueT>::dataPtr() const
19{
20 if(m_internal.get()==nullptr)
21 return nullptr ;
22
23 auto env = SYCLEnv::instance() ;
24 auto& queue = env->internal()->queue() ;
25 auto max_num_treads = env->maxNumThreads() ;
26
27 auto values = malloc_device<ValueT>(m_local_size, queue);
28
29 queue.submit( [&](sycl::handler& cgh)
30 {
31 auto access_x = m_internal->m_values.template get_access<sycl::access::mode::read>(cgh);
32 std::size_t y_length = m_local_size ;
33 cgh.parallel_for<class init_vector_ptr>(sycl::range<1>{max_num_treads}, [=] (sycl::item<1> itemId)
34 {
35 auto id = itemId.get_id(0);
36 for (auto i = id; i < y_length; i += itemId.get_range()[0])
37 values[i] = access_x[i];
38 });
39 });
40 queue.wait() ;
41 return values ;
42}
43
44
45template <typename ValueT>
46void
47HCSRVector<ValueT>::copyValuesTo(ValueType* values) const
48{
49 if(m_internal.get()==nullptr)
50 return ;
51
52 auto env = SYCLEnv::instance() ;
53 auto& queue = env->internal()->queue() ;
54 auto max_num_treads = env->maxNumThreads() ;
55
56 queue.submit( [&](sycl::handler& cgh)
57 {
58 auto access_x = m_internal->m_values.template get_access<sycl::access::mode::read>(cgh);
59 std::size_t y_length = m_local_size ;
60 cgh.parallel_for<class init_vector_ptr>(sycl::range<1>{max_num_treads}, [=] (sycl::item<1> itemId)
61 {
62 auto id = itemId.get_id(0);
63 for (auto i = id; i < y_length; i += itemId.get_range()[0])
64 values[i] = access_x[i];
65 });
66 });
67 queue.wait() ;
68}
69
70template <typename ValueT>
71void HCSRVector<ValueT>::initDevicePointers(int** rows, ValueType** values) const
72{
73 if(m_internal.get()==nullptr)
74 return ;
75
76 auto env = SYCLEnv::instance() ;
77 auto& queue = env->internal()->queue() ;
78 auto max_num_treads = env->maxNumThreads() ;
79
80 auto values_ptr = malloc_device<ValueT>(m_local_size, queue);
81 auto rows_ptr = malloc_device<IndexType>(m_local_size, queue);
82
83 queue.submit( [&](sycl::handler& cgh)
84 {
85 auto access_x = m_internal->m_values.template get_access<sycl::access::mode::read>(cgh);
86 std::size_t y_length = m_local_size ;
87 cgh.parallel_for<class init_hcsrvector_ptr>(sycl::range<1>{max_num_treads}, [=] (sycl::item<1> itemId)
88 {
89 auto id = itemId.get_id(0);
90 for (auto i = id; i < y_length; i += itemId.get_range()[0])
91 {
92 values_ptr[i] = access_x[i];
93 rows_ptr[i] = i ;
94 }
95 });
96 });
97 queue.wait() ;
98 *values = values_ptr;
99 *rows = rows_ptr;
100}
101
102template <typename ValueT>
103void HCSRVector<ValueT>::freeDevicePointers(int* rows, ValueType* values) const
104{
105 auto env = SYCLEnv::instance() ;
106 auto& queue = env->internal()->queue() ;
107 sycl::free(values,queue) ;
108 sycl::free(rows,queue) ;
109}
110
111template class HCSRVector<Real>;
112
113} // namespace Alien
114
115/*---------------------------------------------------------------------------*/
116/*---------------------------------------------------------------------------*/
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Definition BackEnd.h:17