35 typedef ValueT ValueType ;
36 typedef sycl::buffer<ValueType, 1> ValueBufferType ;
38 typedef sycl::buffer<int> IndexBufferType ;
39 typedef std::unique_ptr<IndexBufferType> IndexBufferPtrType ;
42 SYCLSendRecvOp(ValueBufferType& send_buffer,
44 IndexBufferType& send_ids,
45 Alien::SimpleCSRInternal::CommProperty::ePolicyType send_policy,
46 ValueBufferType& recv_buffer,
48 IndexBufferType& recv_ids,
49 Alien::SimpleCSRInternal::CommProperty::ePolicyType recv_policy,
50 IMessagePassingMng* mng,
51 Arccore::ITraceMng* trace_mng)
52 : m_send_buffer(send_buffer)
53 , m_send_info(send_info)
54 , m_send_ids(send_ids)
55 , m_send_policy(send_policy)
56 , m_recv_buffer(recv_buffer)
57 , m_recv_info(recv_info)
58 , m_recv_ids(recv_ids)
59 , m_recv_policy(recv_policy)
64 virtual ~SYCLSendRecvOp()
67 auto& queue = SYCLEnv::instance()->internal()->queue();
68 sycl::free(m_rbuffer, queue);
69 sycl::free(m_sbuffer, queue);
73 void start([[maybe_unused]]
bool insitu =
false)
79 auto env = SYCLEnv::instance();
80 auto& queue = env->internal()->queue();
81 auto total_threads = env->maxNumThreads() ;
83 if (m_recv_policy == Alien::SimpleCSRInternal::CommProperty::ASynch) {
84 m_recv_request.resize(m_recv_info.m_num_neighbours);
85 Integer total_nb_recv_ids = m_recv_info.m_ids_offset[m_recv_info.m_num_neighbours] - m_recv_info.m_ids_offset[0];
87 m_rbuffer = sycl::malloc_shared<ValueT>(total_nb_recv_ids, queue);
89 m_rbuffer.resize(total_nb_recv_ids);
91 for (Integer i = 0; i < m_recv_info.m_num_neighbours; ++i) {
92 Integer off = m_recv_info.m_ids_offset[i] - m_recv_info.m_ids_offset[0];
93 Integer size = m_recv_info.m_ids_offset[i + 1] - off;
95 ValueT* ptr = m_rbuffer + off;
97 ValueT* ptr = m_rbuffer.data() + off;
99 Integer rank = m_recv_info.m_ranks[i];
102 Arccore::MessagePassing::mpReceive(m_parallel_mng,
103 ArrayView<ValueT>(size, ptr),
108 if (m_send_policy == Alien::SimpleCSRInternal::CommProperty::ASynch)
109 m_send_request.resize(m_send_info.m_num_neighbours);
110 if (m_send_info.m_ids.size()) {
111 std::size_t total_nb_send_ids = m_send_info.m_ids_offset[m_send_info.m_num_neighbours] - m_send_info.m_ids_offset[0];
113 m_sbuffer = sycl::malloc_shared<ValueT>(total_nb_send_ids, queue);
115 m_sbuffer.resize(total_nb_send_ids);
119 sycl::buffer<ValueType> sbuffer{ { sycl::buffer_allocation::empty_view(m_sbuffer, queue.get_device()) }, total_nb_send_ids };
121 sycl::buffer<ValueType> sbuffer(m_sbuffer.data(), total_nb_send_ids);
124 queue.submit([&](sycl::handler& cgh)
126 auto access_send_buffer = m_send_buffer.template get_access<sycl::access::mode::read>(cgh);
127 auto access_ids = m_send_ids.template get_access<sycl::access::mode::read>(cgh);
128 auto access_sbuffer = sycl::accessor(sbuffer, cgh, sycl::write_only, sycl::property::no_init{});
130 cgh.parallel_for<
class vector_mult_send>(sycl::range<1>{total_threads},
131 [=] (sycl::item<1> itemId)
133 auto id = itemId.get_id(0);
134 for(
auto i=
id; i<total_nb_send_ids; i+=total_threads)
135 access_sbuffer[i] = access_send_buffer[access_ids[i]];
144 for (Integer i = 0; i < m_send_info.m_num_neighbours; ++i) {
145 Integer off = m_send_info.m_ids_offset[i];
146 Integer nb_send_ids = m_send_info.m_ids_offset[i + 1] - off;
148 ValueT
const* ptr = m_sbuffer + off;
150 ValueT
const* ptr = m_sbuffer.data() + off;
152 Integer rank = m_send_info.m_ranks[i];
153 if (m_send_policy == Alien::SimpleCSRInternal::CommProperty::ASynch)
154 m_send_request[i] = Arccore::MessagePassing::mpSend(m_parallel_mng,
155 ConstArrayView<ValueT>(nb_send_ids, ptr), rank,
false);
157 Arccore::MessagePassing::mpSend(m_parallel_mng,
158 ConstArrayView<ValueT>(nb_send_ids, ptr), rank);
165 void end([[maybe_unused]]
bool insitu =
false)
171 auto env = SYCLEnv::instance();
172 auto& queue = env->internal()->queue();
173 auto total_threads = env->maxNumThreads() ;
175 if (m_recv_policy == Alien::SimpleCSRInternal::CommProperty::ASynch) {
176 Arccore::MessagePassing::mpWaitAll(m_parallel_mng, m_recv_request);
184 if (m_recv_info.m_ids.size()) {
185 Arccore::Integer total_recv_ids = m_recv_info.m_ids_offset[m_recv_info.m_num_neighbours] - m_recv_info.m_ids_offset[0];
187 m_rbuffer = sycl::malloc_shared<ValueT>(total_recv_ids, queue);
189 m_rbuffer.resize(total_recv_ids);
192 for (Integer i = 0; i < m_recv_info.m_num_neighbours; ++i) {
193 Integer off = m_recv_info.m_ids_offset[i];
194 Integer size = m_recv_info.m_ids_offset[i + 1] - off;
196 ValueT* ptr = m_rbuffer + off;
198 ValueT* ptr = m_rbuffer.data() + off;
200 Integer rank = m_recv_info.m_ranks[i];
201 Arccore::MessagePassing::mpReceive(m_parallel_mng, ArrayView<ValueT>(size, ptr), rank);
204 if (m_recv_info.m_ids.size()) {
205 std::size_t total_nb_recv_ids = m_recv_info.m_ids_offset[m_recv_info.m_num_neighbours] - m_recv_info.m_ids_offset[0];
209 sycl::buffer<ValueType> rbuffer{ { sycl::buffer_allocation::view(m_rbuffer, queue.get_device()) }, total_nb_recv_ids };
211 sycl::buffer<ValueType> rbuffer(m_rbuffer.data(), total_nb_recv_ids);
214 queue.submit([&](sycl::handler& cgh)
219 sycl::accessor<ValueType> access_recv_buffer{m_recv_buffer, cgh, sycl::write_only, sycl::property::no_init{}};
222 auto access_recv_buffer = sycl::accessor(m_recv_buffer, cgh, sycl::write_only, sycl::property::no_init{});
225 auto access_recv_buffer = sycl::accessor(m_recv_buffer, cgh, sycl::write_only, sycl::property::no_init{});
229 sycl::accessor<ValueType> access_rbuffer{rbuffer, cgh};
231 cgh.parallel_for<
class vector_mult_recv>(sycl::range<1>{total_threads},
232 [=] (sycl::item<1> itemId)
234 auto id = itemId.get_id(0);
235 for(
auto i=
id;i<total_nb_recv_ids;i += total_threads)
236 access_recv_buffer[i] = access_rbuffer[i];
242 if (m_send_policy == Alien::SimpleCSRInternal::CommProperty::ASynch) {
243 Arccore::MessagePassing::mpWaitAll(m_parallel_mng, m_send_request);
250 void upperRecv([[maybe_unused]]
bool insitu =
true)
258 void lowerRecv([[maybe_unused]]
bool insitu =
true)
268 ValueBufferType& m_send_buffer;
270 IndexBufferType& m_send_ids;
271 Alien::SimpleCSRInternal::CommProperty::ePolicyType m_send_policy;
273 ValueBufferType& m_recv_buffer;
275 IndexBufferType& m_recv_ids;
276 Alien::SimpleCSRInternal::CommProperty::ePolicyType m_recv_policy;
278 ValueT* m_rbuffer =
nullptr;
279 ValueT* m_sbuffer =
nullptr;
281 std::vector<ValueT> m_rbuffer ;
282 std::vector<ValueT> m_sbuffer ;
284 Arccore::Integer m_unknowns_num = 0;
285 Arccore::MessagePassing::IMessagePassingMng* m_parallel_mng =
nullptr;
286 Arccore::ITraceMng* m_trace =
nullptr;
287 Arccore::UniqueArray<Arccore::MessagePassing::Request> m_recv_request;
288 Arccore::UniqueArray<Arccore::MessagePassing::Request> m_send_request;