Distributed Ranges
Loading...
Searching...
No Matches
memory.hpp
1// SPDX-FileCopyrightText: Intel Corporation
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5#pragma once
6
7#include <cstring>
8
9namespace dr {
10
11template <typename T> struct default_memory {
12 using value_type = T;
13 std::allocator<T> std_allocator;
14
15 T *allocate(std::size_t size) {
16 auto p = std_allocator.allocate(size);
17 assert(p != nullptr);
18 memset(p, 0, sizeof(T) * size);
19 return p;
20 }
21
22 template <typename F> F *allocate(std::size_t size) {
23 std::allocator<F> allocator;
24 auto p = allocator.allocate(size);
25 assert(p != nullptr);
26 memset(p, 0, sizeof(F) * size);
27 return p;
28 }
29
30 constexpr void deallocate(T *p, std::size_t n) {
31 std_allocator.deallocate(p, n);
32 }
33
34 template <typename F> void deallocate(F *p, std::size_t n) {
35 std::allocator<F> allocator;
36 allocator.deallocate(p, n);
37 p = nullptr;
38 }
39
40 void memcpy(void *dst, const void *src, std::size_t numBytes) {
41 std::memcpy(dst, src, numBytes);
42 }
43
44 template <typename F> void offload(F lambda) { lambda(); }
45};
46
47#ifdef SYCL_LANGUAGE_VERSION
48template <typename T> struct sycl_memory {
49 using value_type = T;
50 using device_type = sycl::device;
51
52 sycl::device device_;
53 sycl::context context_;
54 sycl::usm::alloc kind_;
55 std::size_t alignment_;
56 sycl::queue offload_queue_;
57
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) {}
63
64 T *allocate(std::size_t n) {
65 auto p = sycl::aligned_alloc<T>(alignment_, n, device_, context_, kind_);
66 assert(p != nullptr);
67 return p;
68 }
69
70 template <typename F> F *allocate(std::size_t n) {
71 auto p = sycl::aligned_alloc<F>(alignment_, n, device_, context_, kind_);
72 assert(p != nullptr);
73 return p;
74 }
75
76 void deallocate(T *p, std::size_t n) {
77 assert(p != nullptr);
78 sycl::free(p, context_);
79 p = nullptr;
80 }
81
82 template <typename F> void deallocate(F *p, std::size_t n) {
83 assert(p != nullptr);
84 sycl::free(p, context_);
85 p = nullptr;
86 }
87
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();
92 }
93
94 template <typename F> void offload(F lambda) {
95 if (kind_ == sycl::usm::alloc::device) {
96 offload_queue_.single_task(lambda).wait();
97 } else {
98 lambda();
99 }
100 }
101};
102#endif
103
104} // namespace dr
Definition: memory.hpp:11