Shamrock 2025.10.0
Astrophysical Code
Loading...
Searching...
No Matches
USMBufferInterop.hpp
Go to the documentation of this file.
1// -------------------------------------------------------//
2//
3// SHAMROCK code for hydrodynamics
4// Copyright (c) 2021-2026 Timothée David--Cléris <tim.shamrock@proton.me>
5// SPDX-License-Identifier: CeCILL Free Software License Agreement v2.1
6// Shamrock is licensed under the CeCILL 2.1 License, see LICENSE for more information
7//
8// -------------------------------------------------------//
9
10#pragma once
11
19#include "shambackends/math.hpp"
20#include "shambackends/sycl.hpp"
22#include "shamcomm/logs.hpp"
23
24namespace sham {
35 template<class T>
36 inline std::vector<sycl::event> usmbuffer_memcpy(
37 sycl::queue &queue, sycl::buffer<T> &src, T *dest, u64 count) {
38
39 u64 offset = 0;
40 u64 remains = count;
41 constexpr u64 max_step_size = i32_max / 2;
42
43 std::vector<sycl::event> ev_list{};
44
45 while (offset < count) {
46 u64 stepsize = sham::min(remains, max_step_size);
47
48 ev_list.push_back(queue.submit([&, offset](sycl::handler &cgh) {
49 sycl::accessor acc{src, cgh, sycl::read_only};
50 shambase::parallel_for(cgh, stepsize, "memcpy kernel", [=](u32 gid) {
51 dest[gid + offset] = acc[gid + offset];
52 });
53 }));
54
55 offset += stepsize;
56 remains -= stepsize;
57 };
58
59 return ev_list;
60 }
61
72 template<class T>
73 inline std::vector<sycl::event> usmbuffer_memcpy(
74 sycl::queue &queue, const T *src, sycl::buffer<T> &dest, u64 count) {
75
76 u64 offset = 0;
77 u64 remains = count;
78 constexpr u64 max_step_size = i32_max / 2;
79
80 std::vector<sycl::event> ev_list{};
81
82 while (offset < count) {
83 u64 stepsize = sham::min(remains, max_step_size);
84
85 ev_list.push_back(queue.submit([&, offset](sycl::handler &cgh) {
86 sycl::accessor acc{dest, cgh, sycl::write_only};
87 shambase::parallel_for(cgh, stepsize, "memcpy kernel", [=](u32 gid) {
88 acc[gid + offset] = src[gid + offset];
89 });
90 }));
91
92 offset += stepsize;
93 remains -= stepsize;
94 };
95
96 return ev_list;
97 }
98
110 template<class T>
111 inline std::vector<sycl::event> usmbuffer_memcpy_discard(
112 sycl::queue &queue, const T *src, sycl::buffer<T> &dest, u64 count) {
113 u64 offset = 0;
114 u64 remains = count;
115 constexpr u64 max_step_size = i32_max / 2;
116
117 std::vector<sycl::event> ev_list{};
118
119 while (offset < count) {
120 u64 stepsize = sham::min(remains, max_step_size);
121
122 ev_list.push_back(queue.submit([&, offset](sycl::handler &cgh) {
123 sycl::accessor acc{dest, cgh, sycl::write_only, sycl::no_init};
124 shambase::parallel_for(cgh, stepsize, "memcpy kernel", [=](u32 gid) {
125 acc[gid + offset] = src[gid + offset];
126 });
127 }));
128
129 offset += stepsize;
130 remains -= stepsize;
131 };
132
133 return ev_list;
134 }
135
136} // namespace sham
std::uint32_t u32
32 bit unsigned integer
std::uint64_t u64
64 bit unsigned integer
namespace for backends this one is named only sham since shambackends is too long to write
std::vector< sycl::event > usmbuffer_memcpy(sycl::queue &queue, sycl::buffer< T > &src, T *dest, u64 count)
perform a copy from a buffer to a USM pointer
std::vector< sycl::event > usmbuffer_memcpy_discard(sycl::queue &queue, const T *src, sycl::buffer< T > &dest, u64 count)
perform a copy from a USM pointer to a buffer (and assume discard write for the buffer)
constexpr i32 i32_max
i32 max value