-
Notifications
You must be signed in to change notification settings - Fork 36
Expand file tree
/
Copy pathusm_operations.py
More file actions
140 lines (108 loc) · 4.14 KB
/
usm_operations.py
File metadata and controls
140 lines (108 loc) · 4.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# Data Parallel Control (dpctl)
#
# Copyright 2020-2025 Intel Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
Demonstrates SYCL USM memory usage in Python using dpctl.memory.
Includes allocation, host access, and host-device copying.
"""
import numpy as np
import dpctl.memory as dpmem
def usm_allocation():
"""
Example demonstrating ways to allocate USM using dpctl.memory.
"""
# allocate USM-shared byte-buffer
ms = dpmem.MemoryUSMShared(16)
print(f"USM-shared buffer allocated with size: {len(ms)}")
# allocate USM-device byte-buffer
md = dpmem.MemoryUSMDevice(16)
print(f"USM-device buffer allocated with size: {len(md)}")
# allocate USM-host byte-buffer
mh = dpmem.MemoryUSMHost(16)
print(f"USM-host buffer allocated with size: {len(mh)}")
# specify alignment
# TODO: add alignment check
mda = dpmem.MemoryUSMDevice(128, alignment=16)
print(f"16-byte aligned USM-device buffer allocated with size: {len(mda)}")
# allocate using given queue,
# i.e. on the device and bound to the context stored in the queue
mdq = dpmem.MemoryUSMDevice(256, queue=mda.sycl_queue)
print(
"USM-device buffers share the same queue: "
f"{mdq.sycl_queue == mda.sycl_queue}"
)
# information about device associate with USM buffer
print("Allocation performed on device:")
mda.sycl_queue.print_device_info()
def usm_host_access():
"""
Example demonstrating that shared and host USM allocations are
host-accessible and thus accessible from Python via buffer protocol.
"""
# USM-shared and USM-host pointers are host-accessible,
# meaning they are accessible from Python, therefore
# they implement Python buffer protocol
# allocate 1K of USM-shared buffer
ms = dpmem.MemoryUSMShared(1024)
# create memoryview into USM-shared buffer
msv = memoryview(ms)
# populate buffer from host one byte at a time
for i in range(len(ms)):
ir = i % 256
msv[i] = ir**2 % 256
mh = dpmem.MemoryUSMHost(64)
mhv = memoryview(mh)
# copy content of block of USM-shared buffer to
# USM-host buffer
mhv[:] = msv[78 : 78 + len(mh)]
print("Byte-values of the USM-host buffer")
print(list(mhv))
# USM-device buffer is not host accessible
md = dpmem.MemoryUSMDevice(16)
try:
memoryview(md)
except Exception as e:
print("")
print(
"An expected exception was raised during attempted construction of "
"memoryview from USM-device memory object."
)
print(f"\t{e}")
def usm_host_device_copy():
"""
Example demonstrating copying operations using dpctl.memory.
"""
ms = dpmem.MemoryUSMShared(32)
md = dpmem.MemoryUSMDevice(32)
host_buf = np.random.randint(0, 42, dtype=np.uint8, size=32)
# copy host byte-like object to USM-device buffer
md.copy_from_host(host_buf)
# copy USM-device buffer to USM-shared buffer in parallel using
# sycl::queue::memcpy.
ms.copy_from_device(md)
# build numpy array reusing host-accessible USM-shared memory
X = np.ndarray((len(ms),), buffer=ms, dtype=np.uint8)
# Display Python object NumPy ndarray is viewing into
print("numpy.ndarray.base: ", X.base)
print("")
# Print content of the view
print("View..........: ", X)
# Print content of the original host buffer
print("host_buf......: ", host_buf)
# use copy_to_host to retrieve memory of USM-device memory
print("copy_to_host(): ", md.copy_to_host())
if __name__ == "__main__":
import _runner as runner
runner.run_examples("Memory examples for dpctl.", globals())