|
23 | 23 |
|
24 | 24 | import dpctl
|
25 | 25 | from dpctl.memory import MemoryUSMDevice, MemoryUSMHost, MemoryUSMShared
|
| 26 | +from dpctl.memory import as_usm_memory |
26 | 27 |
|
27 | 28 | from ._helper import has_cpu, has_gpu, has_sycl_platforms
|
28 | 29 |
|
@@ -249,18 +250,21 @@ def setUp(self):
|
249 | 250 |
|
250 | 251 |
|
251 | 252 | class View:
|
252 |
| - def __init__(self, buf, shape, strides, offset): |
253 |
| - self.buffer = buf |
254 |
| - self.shape = shape |
255 |
| - self.strides = strides |
256 |
| - self.offset = offset |
| 253 | + def __init__(self, buf, shape, strides, offset, syclobj=None): |
| 254 | + self.buffer_ = buf |
| 255 | + self.shape_ = shape |
| 256 | + self.strides_ = strides |
| 257 | + self.offset_ = offset |
| 258 | + self.syclobj_ = syclobj |
257 | 259 |
|
258 | 260 | @property
|
259 | 261 | def __sycl_usm_array_interface__(self):
|
260 |
| - sua_iface = self.buffer.__sycl_usm_array_interface__ |
261 |
| - sua_iface["offset"] = self.offset |
262 |
| - sua_iface["shape"] = self.shape |
263 |
| - sua_iface["strides"] = self.strides |
| 262 | + sua_iface = self.buffer_.__sycl_usm_array_interface__ |
| 263 | + sua_iface["offset"] = self.offset_ |
| 264 | + sua_iface["shape"] = self.shape_ |
| 265 | + sua_iface["strides"] = self.strides_ |
| 266 | + if self.syclobj_: |
| 267 | + sua_iface["syclobj"] = self.syclobj_ |
264 | 268 | return sua_iface
|
265 | 269 |
|
266 | 270 |
|
@@ -330,5 +334,53 @@ def test_suai_non_contig_2D(self):
|
330 | 334 | self.assertTrue(np.array_equal(res, expected_res))
|
331 | 335 |
|
332 | 336 |
|
| 337 | +class TestAsUSMMemory(unittest.TestCase): |
| 338 | + def _with_constructor(self, buffer_cls): |
| 339 | + try: |
| 340 | + buf = buffer_cls(64) |
| 341 | + except Exception: |
| 342 | + self.SkipTest("{} could not be allocated".format(buffer_cls.__name__)) |
| 343 | + # reuse queue from buffer's SUAI |
| 344 | + v = View(buf, shape=(64,), strides=(1,), offset=0) |
| 345 | + m = as_usm_memory(v) |
| 346 | + self.assertTrue(m.get_usm_type() == buf.get_usm_type()) |
| 347 | + self.assertTrue(m._pointer == buf._pointer) |
| 348 | + self.assertTrue(m.sycl_device == buf.sycl_device) |
| 349 | + # Use SyclContext |
| 350 | + v = View(buf, shape=(64,), strides=(1,), offset=0, syclobj=buf.sycl_context) |
| 351 | + m = as_usm_memory(v) |
| 352 | + self.assertTrue(m.get_usm_type() == buf.get_usm_type()) |
| 353 | + self.assertTrue(m._pointer == buf._pointer) |
| 354 | + self.assertTrue(m.sycl_device == buf.sycl_device) |
| 355 | + # Use queue capsule |
| 356 | + v = View(buf, shape=(64,), strides=(1,), offset=0, syclobj=buf._queue._get_capsule()) |
| 357 | + m = as_usm_memory(v) |
| 358 | + self.assertTrue(m.get_usm_type() == buf.get_usm_type()) |
| 359 | + self.assertTrue(m._pointer == buf._pointer) |
| 360 | + self.assertTrue(m.sycl_device == buf.sycl_device) |
| 361 | + # Use context capsule |
| 362 | + v = View(buf, shape=(64,), strides=(1,), offset=0, syclobj=buf.sycl_context._get_capsule()) |
| 363 | + m = as_usm_memory(v) |
| 364 | + self.assertTrue(m.get_usm_type() == buf.get_usm_type()) |
| 365 | + self.assertTrue(m._pointer == buf._pointer) |
| 366 | + self.assertTrue(m.sycl_device == buf.sycl_device) |
| 367 | + # Use filter string |
| 368 | + v = View(buf, shape=(64,), strides=(1,), offset=0, syclobj=buf.sycl_device.filter_string) |
| 369 | + m = as_usm_memory(v) |
| 370 | + self.assertTrue(m.get_usm_type() == buf.get_usm_type()) |
| 371 | + self.assertTrue(m._pointer == buf._pointer) |
| 372 | + self.assertTrue(m.sycl_device == buf.sycl_device) |
| 373 | + |
| 374 | + |
| 375 | + def test_from_device(self): |
| 376 | + self._with_constructor(MemoryUSMDevice) |
| 377 | + |
| 378 | + def test_from_shared(self): |
| 379 | + self._with_constructor(MemoryUSMShared) |
| 380 | + |
| 381 | + def test_from_host(self): |
| 382 | + self._with_constructor(MemoryUSMHost) |
| 383 | + |
| 384 | + |
333 | 385 | if __name__ == "__main__":
|
334 | 386 | unittest.main()
|
0 commit comments