13 std::allocator<T> std_allocator;
15 T *allocate(std::size_t size) {
16 auto p = std_allocator.allocate(size);
18 memset(p, 0,
sizeof(T) * size);
22 template <
typename F> F *allocate(std::size_t size) {
23 std::allocator<F> allocator;
24 auto p = allocator.allocate(size);
26 memset(p, 0,
sizeof(F) * size);
30 constexpr void deallocate(T *p, std::size_t n) {
31 std_allocator.deallocate(p, n);
34 template <
typename F>
void deallocate(F *p, std::size_t n) {
35 std::allocator<F> allocator;
36 allocator.deallocate(p, n);
40 void memcpy(
void *dst,
const void *src, std::size_t numBytes) {
41 std::memcpy(dst, src, numBytes);
44 template <
typename F>
void offload(F lambda) { lambda(); }
47#ifdef SYCL_LANGUAGE_VERSION
48template <
typename T>
struct sycl_memory {
50 using device_type = sycl::device;
53 sycl::context context_;
54 sycl::usm::alloc kind_;
55 std::size_t alignment_;
56 sycl::queue offload_queue_;
58 sycl_memory(sycl::queue queue,
59 sycl::usm::alloc kind = sycl::usm::alloc::shared,
60 std::size_t alignment = 1)
61 : device_(queue.get_device()), context_(queue.get_context()), kind_(kind),
62 alignment_(alignment), offload_queue_(queue) {}
64 T *allocate(std::size_t n) {
65 auto p = sycl::aligned_alloc<T>(alignment_, n, device_, context_, kind_);
70 template <
typename F> F *allocate(std::size_t n) {
71 auto p = sycl::aligned_alloc<F>(alignment_, n, device_, context_, kind_);
76 void deallocate(T *p, std::size_t n) {
78 sycl::free(p, context_);
82 template <
typename F>
void deallocate(F *p, std::size_t n) {
84 sycl::free(p, context_);
88 void memcpy(
void *dst,
const void *src, std::size_t numBytes) {
89 assert(dst !=
nullptr);
90 assert(src !=
nullptr);
91 offload_queue_.memcpy(dst, src, numBytes).wait();
94 template <
typename F>
void offload(F lambda) {
95 if (kind_ == sycl::usm::alloc::device) {
96 offload_queue_.single_task(lambda).wait();
Definition: memory.hpp:11