1717import numbers
1818
1919import numpy as np
20+ import numpy .lib .stride_tricks as np_st
2021import pytest
2122
2223import dpctl
2324
2425# import dpctl.memory as dpmem
2526import dpctl .tensor as dpt
27+ from dpctl .tensor ._usmarray import Device
2628
2729
2830@pytest .mark .parametrize (
@@ -112,6 +114,8 @@ def test_properties():
112114 (2 , 2 , None , 3 , 4 ),
113115 (Ellipsis ,),
114116 (None , slice (0 , None , 2 ), Ellipsis , slice (0 , None , 3 )),
117+ (None , slice (1 , None , 2 ), Ellipsis , slice (1 , None , 3 )),
118+ (None , slice (None , - 1 , - 2 ), Ellipsis , slice (2 , None , 3 )),
115119 (
116120 slice (None , None , - 1 ),
117121 slice (None , None , - 1 ),
@@ -121,10 +125,86 @@ def test_properties():
121125 ],
122126)
123127def test_basic_slice (ind ):
124- X = dpt .usm_ndarray ((2 * 3 , 2 * 4 , 3 * 5 , 3 * 7 ), dtype = "u1" )
128+ X = dpt .usm_ndarray ((2 * 3 , 2 * 4 , 3 * 5 , 2 * 7 ), dtype = "u1" )
125129 Xnp = np .empty (X .shape , dtype = X .dtype )
126130 S = X [ind ]
127131 Snp = Xnp [ind ]
128132 assert S .shape == Snp .shape
129133 assert S .strides == Snp .strides
130134 assert S .dtype == X .dtype
135+
136+
137+ def _from_numpy (np_ary , device = None , usm_type = "shared" ):
138+ if type (np_ary ) is np .ndarray :
139+ if np_ary .flags ["FORC" ]:
140+ x = np_ary
141+ else :
142+ x = np .ascontiguous (np_ary )
143+ R = dpt .usm_ndarray (
144+ np_ary .shape ,
145+ dtype = np_ary .dtype ,
146+ buffer = usm_type ,
147+ buffer_ctor_kwargs = {
148+ "queue" : Device .create_device (device ).sycl_queue
149+ },
150+ )
151+ R .usm_data .copy_from_host (x .reshape ((- 1 )).view ("|u1" ))
152+ return R
153+ else :
154+ raise ValueError ("Expected numpy.ndarray, got {}" .format (type (np_ary )))
155+
156+
157+ def _to_numpy (usm_ary ):
158+ if type (usm_ary ) is dpt .usm_ndarray :
159+ usm_buf = usm_ary .usm_data
160+ s = usm_buf .nbytes
161+ host_buf = usm_buf .copy_to_host ().view (usm_ary .dtype )
162+ usm_ary_itemsize = usm_ary .itemsize
163+ R_offset = (
164+ usm_ary .__sycl_usm_array_interface__ ["offset" ] * usm_ary_itemsize
165+ )
166+ R = np .ndarray ((s ,), dtype = "u1" , buffer = host_buf )
167+ R = R [R_offset :].view (usm_ary .dtype )
168+ R_strides = (usm_ary_itemsize * si for si in usm_ary .strides )
169+ return np_st .as_strided (R , shape = usm_ary .shape , strides = R_strides )
170+ else :
171+ raise ValueError (
172+ "Expected dpctl.tensor.usm_ndarray, got {}" .format (type (usm_ary ))
173+ )
174+
175+
176+ def test_slice_constructor_1d ():
177+ Xh = np .arange (37 , dtype = "i4" )
178+ Xusm = _from_numpy (Xh , device = "gpu" , usm_type = "device" )
179+ for ind in [
180+ slice (1 , None , 2 ),
181+ slice (0 , None , 3 ),
182+ slice (1 , None , 3 ),
183+ slice (2 , None , 3 ),
184+ slice (None , None , - 1 ),
185+ slice (- 2 , 2 , - 2 ),
186+ slice (- 1 , 1 , - 2 ),
187+ slice (None , None , - 13 ),
188+ ]:
189+ assert np .array_equal (
190+ _to_numpy (Xusm [ind ]), Xh [ind ]
191+ ), "Failed for {}" .format (ind )
192+
193+
194+ def test_slice_constructor_3d ():
195+ Xh = np .empty ((37 , 24 , 35 ), dtype = "i4" )
196+ Xusm = _from_numpy (Xh , device = "gpu" , usm_type = "device" )
197+ for ind in [
198+ slice (1 , None , 2 ),
199+ slice (0 , None , 3 ),
200+ slice (1 , None , 3 ),
201+ slice (2 , None , 3 ),
202+ slice (None , None , - 1 ),
203+ slice (- 2 , 2 , - 2 ),
204+ slice (- 1 , 1 , - 2 ),
205+ slice (None , None , - 13 ),
206+ (slice (None , None , - 2 ), Ellipsis , None , 15 ),
207+ ]:
208+ assert np .array_equal (
209+ _to_numpy (Xusm [ind ]), Xh [ind ]
210+ ), "Failed for {}" .format (ind )
0 commit comments