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,
53 : m_send_buffer(send_buffer)
54 , m_send_info(send_info)
55 , m_send_ids(send_ids)
56 , m_send_policy(send_policy)
57 , m_recv_buffer(recv_buffer)
58 , m_recv_info(recv_info)
59 , m_recv_ids(recv_ids)
60 , m_recv_policy(recv_policy)
63 , m_block_size(block_size)
66 virtual ~SYCLSendRecvOp()
69 auto& queue = SYCLEnv::instance()->internal()->queue();
70 sycl::free(m_rbuffer, queue);
71 sycl::free(m_sbuffer, queue);
75 void start([[maybe_unused]]
bool insitu =
false)
81 auto env = SYCLEnv::instance();
82 auto& queue = env->internal()->queue();
83 auto total_threads = env->maxNumThreads() ;
85 if (m_recv_policy == Alien::SimpleCSRInternal::CommProperty::ASynch) {
86 m_recv_request.resize(m_recv_info.m_num_neighbours);
87 Integer total_nb_recv_ids = m_recv_info.m_ids_offset[m_recv_info.m_num_neighbours] - m_recv_info.m_ids_offset[0];
89 m_rbuffer = sycl::malloc_shared<ValueT>(total_nb_recv_ids * m_block_size, queue);
91 m_rbuffer.resize(total_nb_recv_ids * m_block_size);
93 for (Integer i = 0; i < m_recv_info.m_num_neighbours; ++i) {
94 Integer off = m_recv_info.m_ids_offset[i] - m_recv_info.m_ids_offset[0];
95 Integer size = (m_recv_info.m_ids_offset[i + 1] - off) ;
97 ValueT* ptr = m_rbuffer + off*m_block_size;
99 ValueT* ptr = m_rbuffer.data() + off * m_block_size;
101 Integer rank = m_recv_info.m_ranks[i];
104 Arccore::MessagePassing::mpReceive(m_parallel_mng,
105 ArrayView<ValueT>(size*m_block_size, ptr),
110 if (m_send_policy == Alien::SimpleCSRInternal::CommProperty::ASynch)
111 m_send_request.resize(m_send_info.m_num_neighbours);
112 if (m_send_info.m_ids.size()) {
113 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]);
115 m_sbuffer = sycl::malloc_shared<ValueT>(total_nb_send_ids * m_block_size, queue);
117 m_sbuffer.resize(total_nb_send_ids * m_block_size);
121 sycl::buffer<ValueType> sbuffer{ { sycl::buffer_allocation::empty_view(m_sbuffer, queue.get_device()) }, total_nb_send_ids * m_block_size };
123 sycl::buffer<ValueType> sbuffer(m_sbuffer.data(), total_nb_send_ids * m_block_size);
125 const int block_size = m_block_size;
133 auto access_send_buffer = m_send_buffer.template get_access<sycl::access::mode::read>(cgh);
134 auto access_ids = m_send_ids.template get_access<sycl::access::mode::read>(cgh);
135 auto access_sbuffer = sycl::accessor(sbuffer, cgh, sycl::write_only, sycl::property::no_init
138 cgh.parallel_for<
class vector_send>(sycl::range<1>
140 [=] (sycl::item<1> itemId)
142 auto id = itemId.get_id(0);
143 for(
auto i=
id; i<total_nb_send_ids; i+=total_threads)
144 access_sbuffer[i] = access_send_buffer[access_ids[i]];
154 auto access_send_buffer = m_send_buffer.template get_access<sycl::access::mode::read>(cgh);
155 auto access_ids = m_send_ids.template get_access<sycl::access::mode::read>(cgh);
156 auto access_sbuffer = sycl::accessor(sbuffer, cgh, sycl::write_only, sycl::property::no_init
159 cgh.parallel_for<
class vectorN_send>(sycl::range<1>
161 [=] (sycl::item<1> itemId)
163 auto id = itemId.get_id(0);
164 for(
auto i=
id; i<total_nb_send_ids; i+=total_threads)
166 for(
auto j=0; j<block_size; ++j)
167 access_sbuffer[i*block_size+j] = access_send_buffer[access_ids[i]*block_size+j];
175 for (Integer i = 0; i < m_send_info.m_num_neighbours; ++i) {
176 Integer off = m_send_info.m_ids_offset[i];
177 Integer nb_send_ids = m_send_info.m_ids_offset[i + 1] - off;
179 ValueT
const* ptr = m_sbuffer + off * m_block_size;
181 ValueT
const* ptr = m_sbuffer.data() + off * m_block_size;
183 Integer rank = m_send_info.m_ranks[i];
184 if (m_send_policy == Alien::SimpleCSRInternal::CommProperty::ASynch)
185 m_send_request[i] = Arccore::MessagePassing::mpSend(m_parallel_mng,
186 ConstArrayView<ValueT>(nb_send_ids*m_block_size, ptr), rank,
false);
188 Arccore::MessagePassing::mpSend(m_parallel_mng,
189 ConstArrayView<ValueT>(nb_send_ids*m_block_size, ptr), rank);
196 void end([[maybe_unused]]
bool insitu =
false)
202 auto env = SYCLEnv::instance();
203 auto& queue = env->internal()->queue();
204 auto total_threads = env->maxNumThreads() ;
206 if (m_recv_policy == Alien::SimpleCSRInternal::CommProperty::ASynch) {
207 Arccore::MessagePassing::mpWaitAll(m_parallel_mng, m_recv_request);
215 if (m_recv_info.m_ids.size()) {
216 Arccore::Integer total_recv_ids = m_recv_info.m_ids_offset[m_recv_info.m_num_neighbours] - m_recv_info.m_ids_offset[0];
218 m_rbuffer = sycl::malloc_shared<ValueT>(total_recv_ids*m_block_size, queue);
220 m_rbuffer.resize(total_recv_ids*m_block_size);
223 for (Integer i = 0; i < m_recv_info.m_num_neighbours; ++i) {
224 Integer off = m_recv_info.m_ids_offset[i];
225 Integer size = m_recv_info.m_ids_offset[i + 1] - off;
227 ValueT* ptr = m_rbuffer + off*m_block_size;
229 ValueT* ptr = m_rbuffer.data() + off*m_block_size;
231 Integer rank = m_recv_info.m_ranks[i];
232 Arccore::MessagePassing::mpReceive(m_parallel_mng, ArrayView<ValueT>(size*m_block_size, ptr), rank);
235 if (m_recv_info.m_ids.size()) {
236 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];
240 sycl::buffer<ValueType> rbuffer{ { sycl::buffer_allocation::view(m_rbuffer, queue.get_device()) }, total_nb_recv_ids*m_block_size };
242 sycl::buffer<ValueType> rbuffer(m_rbuffer.data(), total_nb_recv_ids*m_block_size);
244 const int block_size = m_block_size;
248 queue.submit([&](sycl::handler& cgh)
253 sycl::accessor<ValueType> access_recv_buffer{m_recv_buffer, cgh, sycl::write_only, sycl::property::no_init{}};
256 auto access_recv_buffer = sycl::accessor(m_recv_buffer, cgh, sycl::write_only, sycl::property::no_init{});
259 auto access_recv_buffer = sycl::accessor(m_recv_buffer, cgh, sycl::write_only, sycl::property::no_init{});
263 sycl::accessor<ValueType> access_rbuffer{rbuffer, cgh};
265 cgh.parallel_for<
class vector_mult_recv>(sycl::range<1>{total_threads},
266 [=] (sycl::item<1> itemId)
268 auto id = itemId.get_id(0);
269 for(
auto i=
id;i<total_nb_recv_ids;i += total_threads)
270 access_recv_buffer[i] = access_rbuffer[i];
276 queue.submit([&](sycl::handler& cgh)
281 sycl::accessor<ValueType> access_recv_buffer{m_recv_buffer, cgh, sycl::write_only, sycl::property::no_init{}};
284 auto access_recv_buffer = sycl::accessor(m_recv_buffer, cgh, sycl::write_only, sycl::property::no_init{});
287 auto access_recv_buffer = sycl::accessor(m_recv_buffer, cgh, sycl::write_only, sycl::property::no_init{});
290 sycl::accessor<ValueType> access_rbuffer{rbuffer, cgh};
292 cgh.parallel_for<
class vectorN_mult_recv>(sycl::range<1>{total_threads},
293 [=] (sycl::item<1> itemId)
295 auto id = itemId.get_id(0);
296 for(
auto i=
id;i<total_nb_recv_ids;i += total_threads)
298 for(
auto j=0;j<block_size;++j)
299 access_recv_buffer[i*block_size+j] = access_rbuffer[i*block_size+j];
307 if (m_send_policy == Alien::SimpleCSRInternal::CommProperty::ASynch) {
308 Arccore::MessagePassing::mpWaitAll(m_parallel_mng, m_send_request);
315 void lowerRecv([[maybe_unused]]
bool insitu =
true)
318 auto env = SYCLEnv::instance();
319 auto& queue = env->internal()->queue();
320 auto total_threads = env->maxNumThreads() ;
323 if (m_recv_info.m_ids.size())
325 Arccore::Integer total_recv_ids = m_recv_info.m_ids_offset[m_recv_info.m_num_neighbours] - m_recv_info.m_ids_offset[0];
327 m_rbuffer = sycl::malloc_shared<ValueT>(total_recv_ids*m_block_size, queue);
329 m_rbuffer.resize(total_recv_ids*m_block_size);
332 for (Integer i = 0; i < m_recv_info.m_first_upper_neighb; ++i)
334 Integer off = m_recv_info.m_ids_offset[i];
335 Integer size = m_recv_info.m_ids_offset[i + 1] - off;
337 ValueT* ptr = m_rbuffer + off*m_block_size;
339 ValueT* ptr = m_rbuffer.data() + off*m_block_size;
341 Integer rank = m_recv_info.m_ranks[i];
342 Arccore::MessagePassing::mpReceive(m_parallel_mng, ArrayView<ValueT>(size*m_block_size, ptr), rank);
345 if (m_recv_info.m_ids.size())
347 std::size_t total_nb_recv_ids = m_recv_info.m_ids_offset[m_recv_info.m_first_upper_neighb] - m_recv_info.m_ids_offset[0];
351 sycl::buffer<ValueType> rbuffer{ { sycl::buffer_allocation::view(m_rbuffer, queue.get_device()) }, total_nb_recv_ids*m_block_size };
353 sycl::buffer<ValueType> rbuffer(m_rbuffer.data(), total_nb_recv_ids*m_block_size);
355 const int block_size = m_block_size;
359 queue.submit([&](sycl::handler& cgh)
364 sycl::accessor<ValueType> access_recv_buffer{m_recv_buffer, cgh, sycl::write_only, sycl::property::no_init{}};
367 auto access_recv_buffer = sycl::accessor(m_recv_buffer, cgh, sycl::write_only, sycl::property::no_init{});
370 auto access_recv_buffer = sycl::accessor(m_recv_buffer, cgh, sycl::write_only, sycl::property::no_init{});
374 sycl::accessor<ValueType> access_rbuffer{rbuffer, cgh};
376 cgh.parallel_for<
class vector_mult_recv>(sycl::range<1>{total_threads},
377 [=] (sycl::item<1> itemId)
379 auto id = itemId.get_id(0);
380 for(
auto i=
id;i<total_nb_recv_ids;i += total_threads)
381 access_recv_buffer[i] = access_rbuffer[i];
387 queue.submit([&](sycl::handler& cgh)
392 sycl::accessor<ValueType> access_recv_buffer{m_recv_buffer, cgh, sycl::write_only, sycl::property::no_init{}};
395 auto access_recv_buffer = sycl::accessor(m_recv_buffer, cgh, sycl::write_only, sycl::property::no_init{});
398 auto access_recv_buffer = sycl::accessor(m_recv_buffer, cgh, sycl::write_only, sycl::property::no_init{});
401 sycl::accessor<ValueType> access_rbuffer{rbuffer, cgh};
403 cgh.parallel_for<
class vectorN_mult_recv>(sycl::range<1>{total_threads},
404 [=] (sycl::item<1> itemId)
406 auto id = itemId.get_id(0);
407 for(
auto i=
id;i<total_nb_recv_ids;i += total_threads)
409 for(
auto j=0;j<block_size;++j)
410 access_recv_buffer[i*block_size+j] = access_rbuffer[i*block_size+j];
423 auto env = SYCLEnv::instance();
424 auto& queue = env->internal()->queue();
425 auto total_threads = env->maxNumThreads() ;
427 if (m_send_info.m_ids.size())
429 std::size_t total_nb_send_ids = (m_send_info.m_ids_offset[m_send_info.m_first_upper_neighb] - m_send_info.m_ids_offset[0]);
431 m_sbuffer = sycl::malloc_shared<ValueT>(total_nb_send_ids * m_block_size, queue);
433 m_sbuffer.resize(total_nb_send_ids * m_block_size);
437 sycl::buffer<ValueType> sbuffer{ { sycl::buffer_allocation::empty_view(m_sbuffer, queue.get_device()) }, total_nb_send_ids * m_block_size };
439 sycl::buffer<ValueType> sbuffer(m_sbuffer.data(), total_nb_send_ids * m_block_size);
441 const int block_size = m_block_size;
449 auto access_send_buffer = m_send_buffer.template get_access<sycl::access::mode::read>(cgh);
450 auto access_ids = m_send_ids.template get_access<sycl::access::mode::read>(cgh);
451 auto access_sbuffer = sycl::accessor(sbuffer, cgh, sycl::write_only, sycl::property::no_init
454 cgh.parallel_for<
class vector_send>(sycl::range<1>
456 [=] (sycl::item<1> itemId)
458 auto id = itemId.get_id(0);
459 for(
auto i=
id; i<total_nb_send_ids; i+=total_threads)
460 access_sbuffer[i] = access_send_buffer[access_ids[i]];
470 auto access_send_buffer = m_send_buffer.template get_access<sycl::access::mode::read>(cgh);
471 auto access_ids = m_send_ids.template get_access<sycl::access::mode::read>(cgh);
472 auto access_sbuffer = sycl::accessor(sbuffer, cgh, sycl::write_only, sycl::property::no_init
475 cgh.parallel_for<
class vectorN_send>(sycl::range<1>
477 [=] (sycl::item<1> itemId)
479 auto id = itemId.get_id(0);
480 for(
auto i=
id; i<total_nb_send_ids; i+=total_threads)
482 for(
auto j=0; j<block_size; ++j)
483 access_sbuffer[i*block_size+j] = access_send_buffer[access_ids[i]*block_size+j];
492 for (
int i = m_send_info.m_first_upper_neighb - 1; i > -1; --i) {
493 Integer off = m_send_info.m_ids_offset[i];
494 Integer nb_send_ids = m_send_info.m_ids_offset[i + 1] - off;
496 ValueT
const* ptr = m_sbuffer + off * m_block_size;
498 ValueT
const* ptr = m_sbuffer.data() + off * m_block_size;
500 Integer rank = m_send_info.m_ranks[i];
501 Arccore::MessagePassing::mpSend(m_parallel_mng,
502 ConstArrayView<ValueT>(nb_send_ids*m_block_size, ptr), rank);
506 void upperRecv([[maybe_unused]]
bool insitu =
true)
509 auto env = SYCLEnv::instance();
510 auto& queue = env->internal()->queue();
511 auto total_threads = env->maxNumThreads() ;
514 if (m_recv_info.m_ids.size()) {
515 Arccore::Integer total_recv_ids = m_recv_info.m_ids_offset[m_recv_info.m_num_neighbours] - m_recv_info.m_ids_offset[m_recv_info.m_first_upper_neighb];
517 m_rbuffer = sycl::malloc_shared<ValueT>(total_recv_ids*m_block_size, queue);
519 m_rbuffer.resize(total_recv_ids*m_block_size);
523 for (
int i = m_recv_info.m_num_neighbours - 1; i > m_recv_info.m_first_upper_neighb - 1; --i) {
524 Integer off = m_recv_info.m_ids_offset[i];
525 Integer size = m_recv_info.m_ids_offset[i + 1] - off;
527 ValueT* ptr = m_rbuffer + off*m_block_size;
529 ValueT* ptr = m_rbuffer.data() + off*m_block_size;
531 Integer rank = m_recv_info.m_ranks[i];
532 Arccore::MessagePassing::mpReceive(m_parallel_mng, ArrayView<ValueT>(size*m_block_size, ptr), rank);
534 if (m_recv_info.m_ids.size()) {
536 std::size_t total_nb_recv_ids = m_recv_info.m_ids_offset[m_recv_info.m_num_neighbours] -
537 m_recv_info.m_ids_offset[m_recv_info.m_first_upper_neighb];
541 sycl::buffer<ValueType> rbuffer{ { sycl::buffer_allocation::view(m_rbuffer, queue.get_device()) }, total_nb_recv_ids*m_block_size };
543 sycl::buffer<ValueType> rbuffer(m_rbuffer.data(), total_nb_recv_ids*m_block_size);
545 const int block_size = m_block_size;
549 queue.submit([&](sycl::handler& cgh)
554 sycl::accessor<ValueType> access_recv_buffer{m_recv_buffer, cgh, sycl::write_only, sycl::property::no_init{}};
557 auto access_recv_buffer = sycl::accessor(m_recv_buffer, cgh, sycl::write_only, sycl::property::no_init{});
560 auto access_recv_buffer = sycl::accessor(m_recv_buffer, cgh, sycl::write_only, sycl::property::no_init{});
564 sycl::accessor<ValueType> access_rbuffer{rbuffer, cgh};
566 cgh.parallel_for<
class vector_mult_recv>(sycl::range<1>{total_threads},
567 [=] (sycl::item<1> itemId)
569 auto id = itemId.get_id(0);
570 for(
auto i=
id;i<total_nb_recv_ids;i += total_threads)
571 access_recv_buffer[i] = access_rbuffer[i];
577 queue.submit([&](sycl::handler& cgh)
582 sycl::accessor<ValueType> access_recv_buffer{m_recv_buffer, cgh, sycl::write_only, sycl::property::no_init{}};
585 auto access_recv_buffer = sycl::accessor(m_recv_buffer, cgh, sycl::write_only, sycl::property::no_init{});
588 auto access_recv_buffer = sycl::accessor(m_recv_buffer, cgh, sycl::write_only, sycl::property::no_init{});
591 sycl::accessor<ValueType> access_rbuffer{rbuffer, cgh};
593 cgh.parallel_for<
class vectorN_mult_recv>(sycl::range<1>{total_threads},
594 [=] (sycl::item<1> itemId)
596 auto id = itemId.get_id(0);
597 for(
auto i=
id;i<total_nb_recv_ids;i += total_threads)
599 for(
auto j=0;j<block_size;++j)
600 access_recv_buffer[i*block_size+j] = access_rbuffer[i*block_size+j];
612 auto env = SYCLEnv::instance();
613 auto& queue = env->internal()->queue();
614 auto total_threads = env->maxNumThreads() ;
616 if (m_send_info.m_ids.size())
618 int offset = m_send_info.m_ids_offset[m_send_info.m_first_upper_neighb] - m_send_info.m_ids_offset[0];
619 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[m_send_info.m_first_upper_neighb];
621 m_sbuffer = sycl::malloc_shared<ValueT>(total_nb_send_ids * m_block_size, queue);
623 m_sbuffer.resize(total_nb_send_ids * m_block_size);
627 sycl::buffer<ValueType> sbuffer{ { sycl::buffer_allocation::empty_view(m_sbuffer, queue.get_device()) }, total_nb_send_ids * m_block_size };
629 sycl::buffer<ValueType> sbuffer(m_sbuffer.data(), total_nb_send_ids * m_block_size);
631 const int block_size = m_block_size;
639 auto access_send_buffer = m_send_buffer.template get_access<sycl::access::mode::read>(cgh);
640 auto access_ids = m_send_ids.template get_access<sycl::access::mode::read>(cgh);
641 auto access_sbuffer = sycl::accessor(sbuffer, cgh, sycl::write_only, sycl::property::no_init
644 cgh.parallel_for<
class vector_send>(sycl::range<1>
646 [=] (sycl::item<1> itemId)
648 auto id = itemId.get_id(0);
649 for(
auto i=
id; i<total_nb_send_ids; i+=total_threads)
650 access_sbuffer[i] = access_send_buffer[access_ids[offset+i]];
660 auto access_send_buffer = m_send_buffer.template get_access<sycl::access::mode::read>(cgh);
661 auto access_ids = m_send_ids.template get_access<sycl::access::mode::read>(cgh);
662 auto access_sbuffer = sycl::accessor(sbuffer, cgh, sycl::write_only, sycl::property::no_init
665 cgh.parallel_for<
class vectorN_send>(sycl::range<1>
667 [=] (sycl::item<1> itemId)
669 auto id = itemId.get_id(0);
670 for(
auto i=
id; i<total_nb_send_ids; i+=total_threads)
672 for(
auto j=0; j<block_size; ++j)
673 access_sbuffer[i*block_size+j] = access_send_buffer[access_ids[offset+i]*block_size+j];
681 for (
int i = m_send_info.m_first_upper_neighb; i < m_send_info.m_num_neighbours; ++i)
683 Integer off = m_send_info.m_ids_offset[i];
684 Integer nb_send_ids = m_send_info.m_ids_offset[i + 1] - off;
686 ValueT
const* ptr = m_sbuffer + off * m_block_size;
688 ValueT
const* ptr = m_sbuffer.data() + off * m_block_size;
690 Integer rank = m_send_info.m_ranks[i];
691 Arccore::MessagePassing::mpSend(m_parallel_mng,
692 ConstArrayView<ValueT>(nb_send_ids*m_block_size, ptr), rank);
698 ValueBufferType& m_send_buffer;
700 IndexBufferType& m_send_ids;
701 Alien::SimpleCSRInternal::CommProperty::ePolicyType m_send_policy;
703 ValueBufferType& m_recv_buffer;
705 IndexBufferType& m_recv_ids;
706 Alien::SimpleCSRInternal::CommProperty::ePolicyType m_recv_policy;
708 ValueT* m_rbuffer =
nullptr;
709 ValueT* m_sbuffer =
nullptr;
711 std::vector<ValueT> m_rbuffer ;
712 std::vector<ValueT> m_sbuffer ;
714 Arccore::Integer m_block_size = 0;
715 Arccore::MessagePassing::IMessagePassingMng* m_parallel_mng =
nullptr;
716 Arccore::ITraceMng* m_trace =
nullptr;
717 Arccore::UniqueArray<Arccore::MessagePassing::Request> m_recv_request;
718 Arccore::UniqueArray<Arccore::MessagePassing::Request> m_send_request;