Coverage for cuda/core/_memory/_buffer.pyx: 88.99%

218 statements  

« prev     ^ index     » next       coverage.py v7.15.0, created at 2026-07-03 01:38 +0000

1# SPDX-FileCopyrightText: Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. 

2# 

3# SPDX-License-Identifier: Apache-2.0 

4  

5from __future__ import annotations 

6  

7cimport cython 

8from libc.stdint cimport uintptr_t 

9  

10from cuda.bindings cimport cydriver 

11from cuda.core._memory._device_memory_resource import DeviceMemoryResource 

12from cuda.core._memory._pinned_memory_resource import PinnedMemoryResource 

13from cuda.core._memory._ipc cimport IPCBufferDescriptor, IPCDataForBuffer 

14from cuda.core._memory cimport _ipc 

15from cuda.core._resource_handles cimport ( 

16 DevicePtrHandle, 

17 StreamHandle, 

18 deviceptr_create_with_owner, 

19 deviceptr_create_with_mr, 

20 register_mr_dealloc_callback, 

21 as_intptr, 

22 as_cu, 

23 set_deallocation_stream, 

24) 

25from cuda.core.typing import DevicePointerType 

26  

27from cuda.core._stream cimport Stream, Stream_accept, default_stream 

28from cuda.core._utils.cuda_utils cimport HANDLE_RETURN, _parse_fill_value 

29  

30import sys 

31from typing import TYPE_CHECKING 

32  

33from cuda.core._utils.pycompat import BufferProtocol 

34from cuda.core._dlpack import classify_dl_device, make_py_capsule 

35from cuda.core._device import Device 

36  

37if TYPE_CHECKING: 

38 from cuda.core.graph import GraphBuilder 

39  

40  

41# ============================================================================= 

42# MR deallocation callback (invoked from C++ shared_ptr deleter) 

43# ============================================================================= 

44  

45cdef void _mr_dealloc_callback( 

46 object mr, 

47 cydriver.CUdeviceptr ptr, 

48 size_t size, 

49 const StreamHandle& h_stream, 

50) noexcept: 

51 """Called by the C++ deleter to deallocate via MemoryResource.deallocate. 

52  

53 This is the C++ teardown path: there is no Python caller frame from 

54 which to obtain a stream. If the device-pointer handle was created 

55 without ``set_deallocation_stream`` being called (e.g. buffers minted 

56 via ``Buffer.from_handle(ptr, size, mr=mr)`` from DLPack import, 

57 third-party adapters, or other foreign sources), ``h_stream`` is 

58 empty here. Stream-ordered MR ``deallocate`` overrides reject 

59 ``stream=None`` (issue #2001), so without a fallback the destructor 

60 would print a warning and leak the allocation. Fall back to the 

61 legacy/per-thread default stream so the free still happens; this is 

62 the unique exception to the "no implicit default-stream fallback" 

63 policy because the teardown has no other source of truth. 

64 """ 

65 cdef Stream stream 

66 try: 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V _ ` { | CbDbEbFbGbHbIbM N O 0f1f2f3f4fNc5f6f7f] 8f9f[ %fBdkdJbKbabLbMbdbebpbqbfbgb]d^da b c /c:c;cW X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = PcEcqcOccd?cdd} bb+bR S QcRcjcrc,bScsc-bkcTcUcVc.bWclcmcnc/b:b;b=b?b@bXcocpc[b]btc^b_bucYcZc0c`bvcRb1cwcSb{b2c3c4cTb5c|b}b~bUbVbWbXbYbZb6cacbc0b1bxc2b3byc7c8c9ccczc4b!cAc5bdc#c$c%c6b'cecfcgc7b8b9b!b#b$b(chcic%b'bBc(b)bCc)cDcWd? _d=c`d*c,c-cJcKcIcLcd

67 stream = Stream._from_handle(Stream, h_stream) if h_stream else default_stream() 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V _ ` { | CbDbEbFbGbHbIbM N O 0f1f2f3f4fNc5f6f7f] 8f9f[ %fBdkdJbKbabLbMbdbebpbqbfbgb]d^da b c /c:c;cW X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = PcEcqcOccd?cdd} bb+bR S QcRcjcrc,bScsc-bkcTcUcVc.bWclcmcnc/b:b;b=b?b@bXcocpc[b]btc^b_bucYcZc0c`bvcRb1cwcSb{b2c3c4cTb5c|b}b~bUbVbWbXbYbZb6cacbc0b1bxc2b3byc7c8c9ccczc4b!cAc5bdc#c$c%c6b'cecfcgc7b8b9b!b#b$b(chcic%b'bBc(b)bCc)cDcWd? _d=c`d*c,c-cJcKcIcLcd

68 mr.deallocate(int(ptr), size, stream=stream) 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V _ ` { | CbDbEbFbGbHbIbM N O 0f1f2f3f4fNc5f6f7f] 8f9f[ %fBdkdJbKbabLbMbdbebpbqbfbgb]d^da b c /c:c;cW X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = PcEcqcOccd?cdd} bb+bR S QcRcjcrc,bScsc-bkcTcUcVc.bWclcmcnc/b:b;b=b?b@bXcocpc[b]btc^b_bucYcZc0c`bvcRb1cwcSb{b2c3c4cTb5c|b}b~bUbVbWbXbYbZb6cacbc0b1bxc2b3byc7c8c9ccczc4b!cAc5bdc#c$c%c6b'cecfcgc7b8b9b!b#b$b(chcic%b'bBc(b)bCc)cDcWd? _d=c`d*c,c-cJcKcIcLcd

69 except Exception as exc: 2Ic

70 print(f"Warning: mr.deallocate() failed during Buffer destruction: {exc}", 2Ic

71 file=sys.stderr) 2Ic

72  

73register_mr_dealloc_callback(_mr_dealloc_callback) 

74  

75  

76__all__ = ['Buffer', 'MemoryResource'] 

77  

78  

79  

80  

81cdef class Buffer: 

82 """Represent a handle to allocated memory. 

83  

84 This generic object provides a unified representation for how 

85 different memory resources are to give access to their memory 

86 allocations. 

87  

88 Support for data interchange mechanisms are provided by DLPack. 

89  

90 Note 

91 ---- 

92 Pickling an IPC-enabled :class:`Buffer` embeds an 

93 :class:`~_memory.IPCBufferDescriptor`. Unpickling reconstructs the buffer 

94 by calling :meth:`from_ipc_descriptor` and therefore performs an IPC 

95 import. Do not unpickle buffers from untrusted sources. 

96 """ 

97 def __cinit__(self) -> None: 

98 self._clear() 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F CdDdG H I J K L V XdYdZdPfQfRf_ ` { | CbDbEbFbGbHbIb%e'e(evdwdxdM N O rbhb{d|d}d~dae0dNcbeSfibceTfdeUf] eefejbkb1d2d3d4d5d[ ReSeTeUeVeWe3e4eNbOb6d7dXe5eYe6eZe7e0e8e1e9eBd!eEdFd8dkdGdHdPbQbJbKbablbLbMbIdJdKdLddbebpbqbfbgb)e*e]d^d9dVfMd!d[cld]cNdedfdgdmda b c /c:c;cW X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = PcEcqcOccd?cdd} bb+bP Q ^ mbnbR S T U QcRcjcrc,bScsc-bkcTcUcVc.bWclcmcnc/b:b;b=b?b@bXcocpc[b]btc^b_bucYcZc0c`bvcRb1cwcSb{b2c3c4cTb5c|b}b~bUbVbWbXbYbZb6cacbc0b1bxc2b3byc7c8c9ccczc4b!cAc5bdc#c$c%c6b'cecfcgc7b8b9b!b#b$b(chcic%b'bBc(b)bCc)cDcndodFcWd? ~ @cGc+e,e-e#d$d%d'd(d)d*d+d,d-d.d/d:dhd_d=c`d*ccbobid.cHc+cjd,c-cJcKcIcLcd 2eMcmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLf:e;e=e?e@e[e]e^e_e`e{e|e}e~eafbfcfdfefffgfhfifjf^c_c.e/eMfNf#e$eWfXfydOdPd;dQdRdSdTd=d?d@dUd[dVdzdAd@ sbtbubgeheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLekfYfZfMeNelfOePeQevbOfwbxbybzbAbBb

99  

100 def _clear(self) -> None: 

101 self._h_ptr.reset() # Release the handle 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F CdDdG H I J K L V XdYdZdPfQfRf_ ` { | CbDbEbFbGbHbIb%e'e(evdwdxdM N O rbhb{d|d}d~dae0dNcbeSfibceTfdeUf] eefejbkb1d2d3d4d5d[ ReSeTeUeVeWe3e4eNbOb6d7dXe5eYe6eZe7e0e8e1e9eBd!eEdFd8dkdGdHdPbQbJbKbablbLbMbIdJdKdLddbebpbqbfbgb)e*e]d^d9dVfMd!d[cld]cNdedfdgdmda b c /c:c;cW X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = PcEcqcOccd?cdd} bb+bP Q ^ mbnbR S T U QcRcjcrc,bScsc-bkcTcUcVc.bWclcmcnc/b:b;b=b?b@bXcocpc[b]btc^b_bucYcZc0c`bvcRb1cwcSb{b2c3c4cTb5c|b}b~bUbVbWbXbYbZb6cacbc0b1bxc2b3byc7c8c9ccczc4b!cAc5bdc#c$c%c6b'cecfcgc7b8b9b!b#b$b(chcic%b'bBc(b)bCc)cDcndodFcWd? ~ @cGc+e,e-e#d$d%d'd(d)d*d+d,d-d.d/d:dhd_d=c`d*ccbobid.cHc+cjd,c-cJcKcIcLcd 2eMcmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLf:e;e=e?e@e[e]e^e_e`e{e|e}e~eafbfcfdfefffgfhfifjf^c_c.e/eMfNf#e$eWfXfydOdPd;dQdRdSdTd=d?d@dUd[dVdzdAd@ sbtbubgeheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLekfYfZfMeNelfOePeQevbOfwbxbybzbAbBb

102 self._size = 0 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F CdDdG H I J K L V XdYdZdPfQfRf_ ` { | CbDbEbFbGbHbIb%e'e(evdwdxdM N O rbhb{d|d}d~dae0dNcbeSfibceTfdeUf] eefejbkb1d2d3d4d5d[ ReSeTeUeVeWe3e4eNbOb6d7dXe5eYe6eZe7e0e8e1e9eBd!eEdFd8dkdGdHdPbQbJbKbablbLbMbIdJdKdLddbebpbqbfbgb)e*e]d^d9dVfMd!d[cld]cNdedfdgdmda b c /c:c;cW X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = PcEcqcOccd?cdd} bb+bP Q ^ mbnbR S T U QcRcjcrc,bScsc-bkcTcUcVc.bWclcmcnc/b:b;b=b?b@bXcocpc[b]btc^b_bucYcZc0c`bvcRb1cwcSb{b2c3c4cTb5c|b}b~bUbVbWbXbYbZb6cacbc0b1bxc2b3byc7c8c9ccczc4b!cAc5bdc#c$c%c6b'cecfcgc7b8b9b!b#b$b(chcic%b'bBc(b)bCc)cDcndodFcWd? ~ @cGc+e,e-e#d$d%d'd(d)d*d+d,d-d.d/d:dhd_d=c`d*ccbobid.cHc+cjd,c-cJcKcIcLcd 2eMcmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLf:e;e=e?e@e[e]e^e_e`e{e|e}e~eafbfcfdfefffgfhfifjf^c_c.e/eMfNf#e$eWfXfydOdPd;dQdRdSdTd=d?d@dUd[dVdzdAd@ sbtbubgeheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLekfYfZfMeNelfOePeQevbOfwbxbybzbAbBb

103 self._memory_resource = None 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F CdDdG H I J K L V XdYdZdPfQfRf_ ` { | CbDbEbFbGbHbIb%e'e(evdwdxdM N O rbhb{d|d}d~dae0dNcbeSfibceTfdeUf] eefejbkb1d2d3d4d5d[ ReSeTeUeVeWe3e4eNbOb6d7dXe5eYe6eZe7e0e8e1e9eBd!eEdFd8dkdGdHdPbQbJbKbablbLbMbIdJdKdLddbebpbqbfbgb)e*e]d^d9dVfMd!d[cld]cNdedfdgdmda b c /c:c;cW X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = PcEcqcOccd?cdd} bb+bP Q ^ mbnbR S T U QcRcjcrc,bScsc-bkcTcUcVc.bWclcmcnc/b:b;b=b?b@bXcocpc[b]btc^b_bucYcZc0c`bvcRb1cwcSb{b2c3c4cTb5c|b}b~bUbVbWbXbYbZb6cacbc0b1bxc2b3byc7c8c9ccczc4b!cAc5bdc#c$c%c6b'cecfcgc7b8b9b!b#b$b(chcic%b'bBc(b)bCc)cDcndodFcWd? ~ @cGc+e,e-e#d$d%d'd(d)d*d+d,d-d.d/d:dhd_d=c`d*ccbobid.cHc+cjd,c-cJcKcIcLcd 2eMcmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLf:e;e=e?e@e[e]e^e_e`e{e|e}e~eafbfcfdfefffgfhfifjf^c_c.e/eMfNf#e$eWfXfydOdPd;dQdRdSdTd=d?d@dUd[dVdzdAd@ sbtbubgeheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLekfYfZfMeNelfOePeQevbOfwbxbybzbAbBb

104 self._ipc_data = None 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F CdDdG H I J K L V XdYdZdPfQfRf_ ` { | CbDbEbFbGbHbIb%e'e(evdwdxdM N O rbhb{d|d}d~dae0dNcbeSfibceTfdeUf] eefejbkb1d2d3d4d5d[ ReSeTeUeVeWe3e4eNbOb6d7dXe5eYe6eZe7e0e8e1e9eBd!eEdFd8dkdGdHdPbQbJbKbablbLbMbIdJdKdLddbebpbqbfbgb)e*e]d^d9dVfMd!d[cld]cNdedfdgdmda b c /c:c;cW X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = PcEcqcOccd?cdd} bb+bP Q ^ mbnbR S T U QcRcjcrc,bScsc-bkcTcUcVc.bWclcmcnc/b:b;b=b?b@bXcocpc[b]btc^b_bucYcZc0c`bvcRb1cwcSb{b2c3c4cTb5c|b}b~bUbVbWbXbYbZb6cacbc0b1bxc2b3byc7c8c9ccczc4b!cAc5bdc#c$c%c6b'cecfcgc7b8b9b!b#b$b(chcic%b'bBc(b)bCc)cDcndodFcWd? ~ @cGc+e,e-e#d$d%d'd(d)d*d+d,d-d.d/d:dhd_d=c`d*ccbobid.cHc+cjd,c-cJcKcIcLcd 2eMcmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLf:e;e=e?e@e[e]e^e_e`e{e|e}e~eafbfcfdfefffgfhfifjf^c_c.e/eMfNf#e$eWfXfydOdPd;dQdRdSdTd=d?d@dUd[dVdzdAd@ sbtbubgeheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLekfYfZfMeNelfOePeQevbOfwbxbybzbAbBb

105 self._owner = None 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F CdDdG H I J K L V XdYdZdPfQfRf_ ` { | CbDbEbFbGbHbIb%e'e(evdwdxdM N O rbhb{d|d}d~dae0dNcbeSfibceTfdeUf] eefejbkb1d2d3d4d5d[ ReSeTeUeVeWe3e4eNbOb6d7dXe5eYe6eZe7e0e8e1e9eBd!eEdFd8dkdGdHdPbQbJbKbablbLbMbIdJdKdLddbebpbqbfbgb)e*e]d^d9dVfMd!d[cld]cNdedfdgdmda b c /c:c;cW X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = PcEcqcOccd?cdd} bb+bP Q ^ mbnbR S T U QcRcjcrc,bScsc-bkcTcUcVc.bWclcmcnc/b:b;b=b?b@bXcocpc[b]btc^b_bucYcZc0c`bvcRb1cwcSb{b2c3c4cTb5c|b}b~bUbVbWbXbYbZb6cacbc0b1bxc2b3byc7c8c9ccczc4b!cAc5bdc#c$c%c6b'cecfcgc7b8b9b!b#b$b(chcic%b'bBc(b)bCc)cDcndodFcWd? ~ @cGc+e,e-e#d$d%d'd(d)d*d+d,d-d.d/d:dhd_d=c`d*ccbobid.cHc+cjd,c-cJcKcIcLcd 2eMcmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLf:e;e=e?e@e[e]e^e_e`e{e|e}e~eafbfcfdfefffgfhfifjf^c_c.e/eMfNf#e$eWfXfydOdPd;dQdRdSdTd=d?d@dUd[dVdzdAd@ sbtbubgeheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLekfYfZfMeNelfOePeQevbOfwbxbybzbAbBb

106 self._mem_attrs_inited.store(False) 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F CdDdG H I J K L V XdYdZdPfQfRf_ ` { | CbDbEbFbGbHbIb%e'e(evdwdxdM N O rbhb{d|d}d~dae0dNcbeSfibceTfdeUf] eefejbkb1d2d3d4d5d[ ReSeTeUeVeWe3e4eNbOb6d7dXe5eYe6eZe7e0e8e1e9eBd!eEdFd8dkdGdHdPbQbJbKbablbLbMbIdJdKdLddbebpbqbfbgb)e*e]d^d9dVfMd!d[cld]cNdedfdgdmda b c /c:c;cW X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = PcEcqcOccd?cdd} bb+bP Q ^ mbnbR S T U QcRcjcrc,bScsc-bkcTcUcVc.bWclcmcnc/b:b;b=b?b@bXcocpc[b]btc^b_bucYcZc0c`bvcRb1cwcSb{b2c3c4cTb5c|b}b~bUbVbWbXbYbZb6cacbc0b1bxc2b3byc7c8c9ccczc4b!cAc5bdc#c$c%c6b'cecfcgc7b8b9b!b#b$b(chcic%b'bBc(b)bCc)cDcndodFcWd? ~ @cGc+e,e-e#d$d%d'd(d)d*d+d,d-d.d/d:dhd_d=c`d*ccbobid.cHc+cjd,c-cJcKcIcLcd 2eMcmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLf:e;e=e?e@e[e]e^e_e`e{e|e}e~eafbfcfdfefffgfhfifjf^c_c.e/eMfNf#e$eWfXfydOdPd;dQdRdSdTd=d?d@dUd[dVdzdAd@ sbtbubgeheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLekfYfZfMeNelfOePeQevbOfwbxbybzbAbBb

107  

108 def __init__(self, *args, **kwargs) -> None: 

109 raise RuntimeError("Buffer objects cannot be instantiated directly. " 

110 "Please use MemoryResource APIs.") 

111  

112 @classmethod 

113 def _init( 

114 cls, ptr: DevicePointerType, size_t size, mr: MemoryResource | None = None, 

115 ipc_descriptor: IPCBufferDescriptor | None = None, 

116 owner : object | None = None 

117 ) -> Buffer: 

118 """Create a Buffer from a raw pointer. 

119  

120 When ``mr`` is provided, the buffer takes ownership: ``mr.deallocate()`` 

121 is called when the buffer is closed or garbage collected. When ``owner`` 

122 is provided, the owner is kept alive but no deallocation is performed. 

123 """ 

124 if mr is not None and owner is not None: 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V _ ` { | CbDbEbFbGbHbIbM N O {d|d}d~daeNcbecede] eefe[ NbObPbQbJbKbablbLbMbdbebpbqbfbgb]d^da b c /c:c;cW X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = PcEcqcOccd?cdd} bb+bP Q ^ mbnbR S T U QcRcjcrc,bScsc-bkcTcUcVc.bWclcmcnc/b:b;b=b?b@bXcocpc[b]btc^b_bucYcZc0c`bvcRb1cwcSb{b2c3c4cTb5c|b}b~bUbVbWbXbYbZb6cacbc0b1bxc2b3byc7c8c9ccczc4b!cAc5bdc#c$c%c6b'cecfcgc7b8b9b!b#b$b(chcic%b'bBc(b)bCc)cDcWd? 'f_d=c`d*cid,c-cJcKcIcLcd Mc@ sbtbubvbwbxbybzbAbBb

125 raise ValueError("owner and memory resource cannot be both specified together") 2'f

126 cdef Buffer self = Buffer.__new__(cls) 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V _ ` { | CbDbEbFbGbHbIbM N O {d|d}d~daeNcbecede] eefe[ NbObPbQbJbKbablbLbMbdbebpbqbfbgb]d^da b c /c:c;cW X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = PcEcqcOccd?cdd} bb+bP Q ^ mbnbR S T U QcRcjcrc,bScsc-bkcTcUcVc.bWclcmcnc/b:b;b=b?b@bXcocpc[b]btc^b_bucYcZc0c`bvcRb1cwcSb{b2c3c4cTb5c|b}b~bUbVbWbXbYbZb6cacbc0b1bxc2b3byc7c8c9ccczc4b!cAc5bdc#c$c%c6b'cecfcgc7b8b9b!b#b$b(chcic%b'bBc(b)bCc)cDcWd? _d=c`d*cid,c-cJcKcIcLcd Mc@ sbtbubvbwbxbybzbAbBb

127 cdef uintptr_t c_ptr = <uintptr_t>(int(ptr)) 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V _ ` { | CbDbEbFbGbHbIbM N O {d|d}d~daeNcbecede] eefe[ NbObPbQbJbKbablbLbMbdbebpbqbfbgb]d^da b c /c:c;cW X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = PcEcqcOccd?cdd} bb+bP Q ^ mbnbR S T U QcRcjcrc,bScsc-bkcTcUcVc.bWclcmcnc/b:b;b=b?b@bXcocpc[b]btc^b_bucYcZc0c`bvcRb1cwcSb{b2c3c4cTb5c|b}b~bUbVbWbXbYbZb6cacbc0b1bxc2b3byc7c8c9ccczc4b!cAc5bdc#c$c%c6b'cecfcgc7b8b9b!b#b$b(chcic%b'bBc(b)bCc)cDcWd? _d=c`d*cid,c-cJcKcIcLcd Mc@ sbtbubvbwbxbybzbAbBb

128 if mr is not None: 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V _ ` { | CbDbEbFbGbHbIbM N O {d|d}d~daeNcbecede] eefe[ NbObPbQbJbKbablbLbMbdbebpbqbfbgb]d^da b c /c:c;cW X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = PcEcqcOccd?cdd} bb+bP Q ^ mbnbR S T U QcRcjcrc,bScsc-bkcTcUcVc.bWclcmcnc/b:b;b=b?b@bXcocpc[b]btc^b_bucYcZc0c`bvcRb1cwcSb{b2c3c4cTb5c|b}b~bUbVbWbXbYbZb6cacbc0b1bxc2b3byc7c8c9ccczc4b!cAc5bdc#c$c%c6b'cecfcgc7b8b9b!b#b$b(chcic%b'bBc(b)bCc)cDcWd? _d=c`d*cid,c-cJcKcIcLcd Mc@ sbtbubvbwbxbybzbAbBb

129 self._h_ptr = deviceptr_create_with_mr(c_ptr, size, mr) 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V _ ` { | CbDbEbFbGbHbIbM N O {d|d}d~daeNcbecede] eefe[ NbObPbQbJbKbablbLbMbdbebpbqbfbgb]d^da b c /c:c;cW X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = PcEcqcOccd?cdd} bb+bR S QcRcjcrc,bScsc-bkcTcUcVc.bWclcmcnc/b:b;b=b?b@bXcocpc[b]btc^b_bucYcZc0c`bvcRb1cwcSb{b2c3c4cTb5c|b}b~bUbVbWbXbYbZb6cacbc0b1bxc2b3byc7c8c9ccczc4b!cAc5bdc#c$c%c6b'cecfcgc7b8b9b!b#b$b(chcic%b'bBc(b)bCc)cDcWd? _d=c`d*c,c-cJcKcIcLcd

130 else: 

131 self._h_ptr = deviceptr_create_with_owner(c_ptr, owner) 2{d|d}d~daeNcbecede] eefe[ P Q ^ mbnbR S T U idMc@ sbtbubvbwbxbybzbAbBb

132 self._size = size 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V _ ` { | CbDbEbFbGbHbIbM N O {d|d}d~daeNcbecede] eefe[ NbObPbQbJbKbablbLbMbdbebpbqbfbgb]d^da b c /c:c;cW X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = PcEcqcOccd?cdd} bb+bP Q ^ mbnbR S T U QcRcjcrc,bScsc-bkcTcUcVc.bWclcmcnc/b:b;b=b?b@bXcocpc[b]btc^b_bucYcZc0c`bvcRb1cwcSb{b2c3c4cTb5c|b}b~bUbVbWbXbYbZb6cacbc0b1bxc2b3byc7c8c9ccczc4b!cAc5bdc#c$c%c6b'cecfcgc7b8b9b!b#b$b(chcic%b'bBc(b)bCc)cDcWd? _d=c`d*cid,c-cJcKcIcLcd Mc@ sbtbubvbwbxbybzbAbBb

133 self._memory_resource = mr 2*be f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V _ ` { | CbDbEbFbGbHbIbM N O {d|d}d~daeNcbecede] eefe[ NbObPbQbJbKbablbLbMbdbebpbqbfbgb]d^da b c /c:c;cW X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = PcEcqcOccd?cdd} bb+bP Q ^ mbnbR S T U QcRcjcrc,bScsc-bkcTcUcVc.bWclcmcnc/b:b;b=b?b@bXcocpc[b]btc^b_bucYcZc0c`bvcRb1cwcSb{b2c3c4cTb5c|b}b~bUbVbWbXbYbZb6cacbc0b1bxc2b3byc7c8c9ccczc4b!cAc5bdc#c$c%c6b'cecfcgc7b8b9b!b#b$b(chcic%b'bBc(b)bCc)cDcWd? _d=c`d*cid,c-cJcKcIcLcd Mc@ sbtbubvbwbxbybzbAbBb

134 self._ipc_data = IPCDataForBuffer(ipc_descriptor, True) if ipc_descriptor is not None else None 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V _ ` { | CbDbEbFbGbHbIbM N O {d|d}d~daeNcbecede] eefe[ NbObPbQbJbKbablbLbMbdbebpbqbfbgb]d^da b c /c:c;cW X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = PcEcqcOccd?cdd} bb+bP Q ^ mbnbR S T U QcRcjcrc,bScsc-bkcTcUcVc.bWclcmcnc/b:b;b=b?b@bXcocpc[b]btc^b_bucYcZc0c`bvcRb1cwcSb{b2c3c4cTb5c|b}b~bUbVbWbXbYbZb6cacbc0b1bxc2b3byc7c8c9ccczc4b!cAc5bdc#c$c%c6b'cecfcgc7b8b9b!b#b$b(chcic%b'bBc(b)bCc)cDcWd? _d=c`d*cid,c-cJcKcIcLcd Mc@ sbtbubvbwbxbybzbAbBb

135 self._owner = owner 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V _ ` { | CbDbEbFbGbHbIbM N O {d|d}d~daeNcbecede] eefe[ NbObPbQbJbKbablbLbMbdbebpbqbfbgb]d^da b c /c:c;cW X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = PcEcqcOccd?cdd} bb+bP Q ^ mbnbR S T U QcRcjcrc,bScsc-bkcTcUcVc.bWclcmcnc/b:b;b=b?b@bXcocpc[b]btc^b_bucYcZc0c`bvcRb1cwcSb{b2c3c4cTb5c|b}b~bUbVbWbXbYbZb6cacbc0b1bxc2b3byc7c8c9ccczc4b!cAc5bdc#c$c%c6b'cecfcgc7b8b9b!b#b$b(chcic%b'bBc(b)bCc)cDcWd? _d=c`d*cid,c-cJcKcIcLcd Mc@ sbtbubvbwbxbybzbAbBb

136 self._mem_attrs_inited.store(False) 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V _ ` { | CbDbEbFbGbHbIbM N O {d|d}d~daeNcbecede] eefe[ NbObPbQbJbKbablbLbMbdbebpbqbfbgb]d^da b c /c:c;cW X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = PcEcqcOccd?cdd} bb+bP Q ^ mbnbR S T U QcRcjcrc,bScsc-bkcTcUcVc.bWclcmcnc/b:b;b=b?b@bXcocpc[b]btc^b_bucYcZc0c`bvcRb1cwcSb{b2c3c4cTb5c|b}b~bUbVbWbXbYbZb6cacbc0b1bxc2b3byc7c8c9ccczc4b!cAc5bdc#c$c%c6b'cecfcgc7b8b9b!b#b$b(chcic%b'bBc(b)bCc)cDcWd? _d=c`d*cid,c-cJcKcIcLcd Mc@ sbtbubvbwbxbybzbAbBb

137 return self 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V _ ` { | CbDbEbFbGbHbIbM N O {d|d}d~daeNcbecede] eefe[ NbObPbQbJbKbablbLbMbdbebpbqbfbgb]d^da b c /c:c;cW X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = PcEcqcOccd?cdd} bb+bP Q ^ mbnbR S T U QcRcjcrc,bScsc-bkcTcUcVc.bWclcmcnc/b:b;b=b?b@bXcocpc[b]btc^b_bucYcZc0c`bvcRb1cwcSb{b2c3c4cTb5c|b}b~bUbVbWbXbYbZb6cacbc0b1bxc2b3byc7c8c9ccczc4b!cAc5bdc#c$c%c6b'cecfcgc7b8b9b!b#b$b(chcic%b'bBc(b)bCc)cDcWd? _d=c`d*cid,c-cJcKcIcLcd Mc@ sbtbubvbwbxbybzbAbBb

138  

139 @staticmethod 

140 def _reduce_helper(mr, ipc_descriptor): 

141 # The parent process's stream is not portable across processes, so the 

142 # pickle path cannot thread an explicit stream through. Seed the 

143 # imported buffer's deallocation with the current context's default 

144 # stream; the receiver can override via buffer.close(stream). 

145 return Buffer.from_ipc_descriptor(mr, ipc_descriptor, stream=default_stream()) 

146  

147 def __reduce__(self) -> tuple[object, ...]: 

148 # Unpickling performs a live CUDA IPC import from descriptor bytes in the 

149 # pickle stream. Only deserialize Buffers from a trusted principal. 

150 # Must not serialize the parent's stream! 

151 return Buffer._reduce_helper, (self.memory_resource, self.ipc_descriptor) 2ReSeTeUeVeWeNbObXeYeZe0e1eBdEdFdGdHdPbQbJbKbablbLbMbIdJdKdLddbebfbgb

152  

153 @staticmethod 

154 def from_handle( 

155 ptr: DevicePointerType, size_t size, mr: MemoryResource | None = None, 

156 owner: object | None = None, 

157 ) -> Buffer: 

158 """Create a new :class:`Buffer` object from a pointer. 

159  

160 Parameters 

161 ---------- 

162 ptr : :obj:`~_memory.DevicePointerType` 

163 Allocated buffer handle object 

164 size : int 

165 Memory size of the buffer 

166 mr : :obj:`~_memory.MemoryResource`, optional 

167 Memory resource associated with the buffer. When provided, 

168 :meth:`MemoryResource.deallocate` is called when the buffer is 

169 closed or garbage collected. 

170 owner : object, optional 

171 An object holding external allocation that the ``ptr`` points to. 

172 The reference is kept as long as the buffer is alive. 

173 The ``owner`` and ``mr`` cannot be specified together. 

174  

175 Note 

176 ---- 

177 When neither ``mr`` nor ``owner`` is specified, this creates a 

178 non-owning reference. The pointer will NOT be freed when the 

179 :class:`Buffer` is closed or garbage collected. 

180 """ 

181 return Buffer._init(ptr, size, mr=mr, owner=owner) 2_ ` { | CbDbEbFbGbHbIb{d|d}d~daeNcbecede] eefe[ NbObPbQbJbKbablbLbMbdbebpbqbfbgb/c:c;cPcEcqcOccd?cdd} bb+bP Q ^ mbnbR S T U QcRcjcrc,bScsc-bkcTcUcVc.bWclcmcnc/b:b;b=b?b@bXcocpc[b]btc^b_bucYcZc0c`bvcRb1cwcSb{b2c3c4cTb5c|b}b~bUbVbWbXbYbZb6cacbc0b1bxc2b3byc7c8c9ccczc4b!cAc5bdc#c$c%c6b'cecfcgc7b8b9b!b#b$b(chcic%b'bBc(b)bCc)cDc? 'f_d=c`d*cidJcKcIcLcMc@ sbtbubvbwbxbybzbAbBb

182  

183 @classmethod 

184 def from_ipc_descriptor( 

185 cls, mr: DeviceMemoryResource | PinnedMemoryResource, ipc_descriptor: IPCBufferDescriptor, 

186 *, stream: Stream 

187 ) -> Buffer: 

188 """Import a buffer that was exported from another process. 

189  

190 Parameters 

191 ---------- 

192 mr : :obj:`~_memory.DeviceMemoryResource` | :obj:`~_memory.PinnedMemoryResource` 

193 The IPC-enabled memory resource matching the exporting process. 

194 ipc_descriptor : :obj:`~_memory.IPCBufferDescriptor` 

195 The descriptor exported from another process. 

196 stream : :obj:`~_stream.Stream` 

197 Keyword-only. The stream used for asynchronous deallocation when 

198 the buffer is closed or garbage collected. 

199  

200 Note 

201 ---- 

202 The descriptor payload and ``size`` are supplied by the exporting peer 

203 and must be treated as untrusted input unless the peer is known to be 

204 cooperating. 

205 """ 

206 return _ipc.Buffer_from_ipc_descriptor(cls, mr, ipc_descriptor, stream) 2(f)fhdjd

207  

208 @property 

209 def ipc_descriptor(self) -> IPCBufferDescriptor: 

210 """Descriptor for sharing this buffer with other processes.""" 

211 if self._ipc_data is None: 2ReSeTeUeVeWe3e4eNbOb6d7dXe5eYe6eZe7e0e8e1e9eBd!eEdFd8dkdGdHdPbQbJbKbablbLbMbIdJdKdLddbebpbqbfbgbhd+cjd^c_c

212 self._ipc_data = IPCDataForBuffer(_ipc.Buffer_get_ipc_descriptor(self), False) 2ReSeTeUeVeWe3e4eNbOb6d7dXe5eYe6eZe7e0e8e1e9eBd!eEdFd8dkdGdHdPbQbJbKbablbLbMbIdJdKdLddbebpbqbfbgbhd+cjd^c_c

213 return self._ipc_data.ipc_descriptor 2ReSeTeUeVeWe3e4eNbOb6d7dXe5eYe6eZe7e0e8e1e9eBd!eEdFd8dkdGdHdPbQbJbKbablbLbMbIdJdKdLddbebpbqbfbgb+c^c_c

214  

215 def close(self, stream: Stream | GraphBuilder | None = None) -> None: 

216 """Deallocate this buffer asynchronously on the given stream. 

217  

218 This buffer is released back to their memory resource 

219 asynchronously on the given stream. 

220  

221 Parameters 

222 ---------- 

223 stream : :obj:`~_stream.Stream` | :obj:`~graph.GraphBuilder`, optional 

224 The stream object to use for asynchronous deallocation. If None, 

225 the deallocation stream stored in the handle is used. 

226 """ 

227 Buffer_close(self, stream) 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L XdYdZd_ ` { | CbDbEbFbGbHbIbvdwdxdM N O rbhb0f1f2f3f4f0dNc5f!fib6f#f7f$f] 8f9fjbkb1d2d3d4d5d[ ablbdbebpbqbfbgb9dMd!d[cld]cNdedfdgdmdPcEcqcP Q ^ R S T U QcRcjcrc,bScsc-bkcTcUcVc.bWclcmcnc/b:b;b=b?b@bXcocpc[b]btc^b_bucYcZc0c`bvcRb1cwcSb{b2c3c4cTb5c|b}b~bUbVbWbXbYbZb6cacbc0b1bxc2b3byc7c8c9ccczc4b!cAc5bdc#c$c%c6b'cecfcgc7b8b9b!b#b$b(chcic%b'bBc(b)bCc)cDcndodFc@cGc#d$d%d'd(d)d*d+d,d-d.d/d:dhd=c*ccbobid.cHc+cjd,c-cJcKcIcLc^c_cydOdPd;dQdRdSdTd=d?d@dUd[dVdzdAd

228  

229 def __enter__(self): 

230 return self 2[cld]cfdgdmd

231  

232 def __exit__(self, exc_type, exc_val, exc_tb): 

233 self.close() 2[cld]cfdgdmd

234 return False 2[cld]cfdgdmd

235  

236 def copy_to(self, dst: Buffer | None = None, *, stream: Stream | GraphBuilder) -> Buffer: 

237 """Copy from this buffer to the dst buffer asynchronously on the given stream. 

238  

239 Copies the data from this buffer to the provided dst buffer. 

240 If the dst buffer is not provided, then a new buffer is first 

241 allocated using the associated memory resource before the copy. 

242  

243 Parameters 

244 ---------- 

245 dst : :obj:`~_memory.Buffer`, optional 

246 Destination buffer to copy data to. If not provided, a new buffer 

247 is allocated using this buffer's memory resource. 

248 stream : :obj:`~_stream.Stream` | :obj:`~graph.GraphBuilder` 

249 Keyword argument specifying the stream for the 

250 asynchronous copy 

251  

252 """ 

253 cdef Stream s = Stream_accept(stream) 2a b c qcFcGcHcd

254 cdef size_t src_size = self._size 2a b c qcFcGcHcd

255  

256 if dst is None: 2a b c qcFcGcHcd

257 if self._memory_resource is None: 

258 raise ValueError("a destination buffer must be provided (this " 

259 "buffer does not have a memory_resource)") 

260 dst = self._memory_resource.allocate(src_size, stream=s) 

261  

262 cdef size_t dst_size = dst._size 2a b c qcFcGcHcd

263 if dst_size != src_size: 2a b c qcFcGcHcd

264 raise ValueError( "buffer sizes mismatch between src and dst (sizes " 

265 f"are: src={src_size}, dst={dst_size})" 

266 ) 

267 with nogil: 2a b c qcFcGcHcd

268 HANDLE_RETURN(cydriver.cuMemcpyAsync( 2a b c qcFcGcHcd

269 as_cu(dst._h_ptr), as_cu(self._h_ptr), src_size, as_cu(s._h_stream))) 

270 return dst 2a b c qcFcGcHcd

271  

272 def copy_from(self, src: Buffer, *, stream: Stream | GraphBuilder) -> None: 

273 """Copy from the src buffer to this buffer asynchronously on the given stream. 

274  

275 Parameters 

276 ---------- 

277 src : :obj:`~_memory.Buffer` 

278 Source buffer to copy data from 

279 stream : :obj:`~_stream.Stream` | :obj:`~graph.GraphBuilder` 

280 Keyword argument specifying the stream for the 

281 asynchronous copy 

282  

283 """ 

284 cdef Stream s = Stream_accept(stream) 2_ ` { | CbDbEbFbGbHbIbNbObPbQbJbKbablbLbMbdbebpbqbfbgb/c:c;cEc

285 cdef size_t dst_size = self._size 2_ ` { | CbDbEbFbGbHbIbNbObPbQbJbKbablbLbMbdbebpbqbfbgb/c:c;cEc

286 cdef size_t src_size = src._size 2_ ` { | CbDbEbFbGbHbIbNbObPbQbJbKbablbLbMbdbebpbqbfbgb/c:c;cEc

287  

288 if src_size != dst_size: 2_ ` { | CbDbEbFbGbHbIbNbObPbQbJbKbablbLbMbdbebpbqbfbgb/c:c;cEc

289 raise ValueError( "buffer sizes mismatch between src and dst (sizes " 

290 f"are: src={src_size}, dst={dst_size})" 

291 ) 

292 with nogil: 2_ ` { | CbDbEbFbGbHbIbNbObPbQbJbKbablbLbMbdbebpbqbfbgb/c:c;cEc

293 HANDLE_RETURN(cydriver.cuMemcpyAsync( 2_ ` { | CbDbEbFbGbHbIbNbObPbQbJbKbablbLbMbdbebpbqbfbgb/c:c;cEc

294 as_cu(self._h_ptr), as_cu(src._h_ptr), dst_size, as_cu(s._h_stream))) 

295  

296 def fill(self, value: int | BufferProtocol, *, stream: Stream | GraphBuilder) -> None: 

297 """Fill this buffer with a repeating byte pattern. 

298  

299 Parameters 

300 ---------- 

301 value : int | :obj:`collections.abc.Buffer` 

302 - int: Must be in range [0, 256). Converted to 1 byte. 

303 - :obj:`collections.abc.Buffer`: Must be 1, 2, or 4 bytes. 

304 stream : :obj:`~_stream.Stream` | :obj:`~graph.GraphBuilder` 

305 Stream for the asynchronous fill operation. 

306  

307 Raises 

308 ------ 

309 TypeError 

310 If value is not an int and does not support the buffer protocol. 

311 ValueError 

312 If value byte length is not 1, 2, or 4. 

313 If buffer size is not divisible by value byte length. 

314 OverflowError 

315 If int value is outside [0, 256). 

316  

317 """ 

318 cdef Stream s_stream = Stream_accept(stream) 2CdDd_ ` { | QcRcjcrc,bScsc-bkcTcUcVc.bWclcmcnc/b:b;b=b?b@bXcocpc[b]btc^b_bucYcZc0c`bvcRb1cwcSb{b2c3c4cTb5c|b}b~bUbVbWbXbYbZb6cacbc0b1bxc2b3byc7c8c9ccczc4b!cAc5bdc#c$c%c6b'cecfcgc7b8b9b!b#b$b(chcic%b'bBc(b)bCc)c

319 cdef unsigned int val 

320 cdef unsigned int elem_size 

321 val, elem_size = _parse_fill_value(value) 2CdDd_ ` { | QcRcjcrc,bScsc-bkcTcUcVc.bWclcmcnc/b:b;b=b?b@bXcocpc[b]btc^b_bucYcZc0c`bvcRb1cwcSb{b2c3c4cTb5c|b}b~bUbVbWbXbYbZb6cacbc0b1bxc2b3byc7c8c9ccczc4b!cAc5bdc#c$c%c6b'cecfcgc7b8b9b!b#b$b(chcic%b'bBc(b)bCc)c

322  

323 cdef size_t buffer_size = self._size 2CdDd_ ` { | jcrc,bsc-bkc.blcmcnc/b:b;b=b?b@bocpc[b]btc^b_buc`bvcRbwcSb{bTb|b}b~bUbVbWbXbYbZbacbc0b1bxc2b3byccczc4bAc5bdc6becfcgc7b8b9b!b#b$bhcic%b'bBc(b)bCc

324 cdef cydriver.CUdeviceptr dst = as_cu(self._h_ptr) 2CdDd_ ` { | jcrc,bsc-bkc.blcmcnc/b:b;b=b?b@bocpc[b]btc^b_buc`bvcRbwcSb{bTb|b}b~bUbVbWbXbYbZbacbc0b1bxc2b3byccczc4bAc5bdc6becfcgc7b8b9b!b#b$bhcic%b'bBc(b)bCc

325 cdef cydriver.CUstream s = as_cu(s_stream._h_stream) 2CdDd_ ` { | jcrc,bsc-bkc.blcmcnc/b:b;b=b?b@bocpc[b]btc^b_buc`bvcRbwcSb{bTb|b}b~bUbVbWbXbYbZbacbc0b1bxc2b3byccczc4bAc5bdc6becfcgc7b8b9b!b#b$bhcic%b'bBc(b)bCc

326  

327 if elem_size == 1: 2CdDd_ ` { | jcrc,bsc-bkc.blcmcnc/b:b;b=b?b@bocpc[b]btc^b_buc`bvcRbwcSb{bTb|b}b~bUbVbWbXbYbZbacbc0b1bxc2b3byccczc4bAc5bdc6becfcgc7b8b9b!b#b$bhcic%b'bBc(b)bCc

328 with nogil: 2CdDd_ ` { | jckclcmcncocpc`b{b|b}b~bacbcccdcecfcgchcic

329 HANDLE_RETURN(cydriver.cuMemsetD8Async(dst, val, buffer_size, s)) 2CdDd_ ` { | jckclcmcncocpc`b{b|b}b~bacbcccdcecfcgchcic

330 elif elem_size == 2: 

331 if buffer_size & 0x1: 2rc,b/b:b;b[b]btcvcRbUbVbWb0b1bxczc4b7b8b9b%b'bBc

332 raise ValueError(f"buffer size ({buffer_size}) must be divisible by 2") 2rctcvcxczcBc

333 with nogil: 2,b/b:b;b[b]bRbUbVbWb0b1b4b7b8b9b%b'b

334 HANDLE_RETURN(cydriver.cuMemsetD16Async(dst, val, buffer_size // 2, s)) 2,b/b:b;b[b]bRbUbVbWb0b1b4b7b8b9b%b'b

335 elif elem_size == 4: 

336 if buffer_size & 0x3: 2sc-b.b=b?b@b^b_bucwcSbTbXbYbZb2b3bycAc5b6b!b#b$b(b)bCc

337 raise ValueError(f"buffer size ({buffer_size}) must be divisible by 4") 2scucwcycAcCc

338 with nogil: 2-b.b=b?b@b^b_bSbTbXbYbZb2b3b5b6b!b#b$b(b)b

339 HANDLE_RETURN(cydriver.cuMemsetD32Async(dst, val, buffer_size // 4, s)) 2-b.b=b?b@b^b_bSbTbXbYbZb2b3b5b6b!b#b$b(b)b

340  

341 def __dlpack__( 

342 self, 

343 *, 

344 stream: int | None = None, 

345 max_version: tuple[int, int] | None = None, 

346 dl_device: tuple[int, int] | None = None, 

347 copy: bool | None = None, 

348 ) -> object: 

349 # Note: we ignore the stream argument entirely (as if it is -1). 

350 # It is the user's responsibility to maintain stream order. 

351 if dl_device is not None: 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = Oc+b? ~ d

352 raise BufferError("Sorry, not supported: dl_device other than None") 2+b

353 if copy is True: 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = Oc+b? ~ d

354 raise BufferError("Sorry, not supported: copy=True") 2+b

355 if max_version is None: 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = Oc+b? ~ d

356 versioned = False 2Oc+b

357 else: 

358 if not isinstance(max_version, tuple) or len(max_version) != 2: 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = +b? ~ d

359 raise BufferError(f"Expected max_version tuple[int, int], got {max_version}") 2+b

360 versioned = max_version >= (1, 0) 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = +b? ~ d

361 capsule = make_py_capsule(self, versioned) 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = Oc+b? ~ d

362 return capsule 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = +b? ~ d

363  

364 def __dlpack_device__(self) -> tuple[int, int]: 

365 return classify_dl_device(self) 2cd?cdd} bb? ~

366  

367 def __buffer__(self, flags: int, /) -> memoryview: 

368 # Support for Python-level buffer protocol as per PEP 688. 

369 # This raises a BufferError unless: 

370 # 1. Python is 3.12+ 

371 # 2. This Buffer object is host accessible 

372 raise NotImplementedError("WIP: Buffer.__buffer__ hasn't been implemented yet.") 

373  

374 def __release_buffer__(self, buffer: memoryview, /) -> None: 

375 # Supporting method paired with __buffer__. 

376 raise NotImplementedError("WIP: Buffer.__release_buffer__ hasn't been implemented yet.") 

377  

378 @property 

379 def device_id(self) -> int: 

380 """Return the device ordinal of this buffer.""" 

381 if self._memory_resource is not None: 2%e'e(e)e*e?c+bP Q ^ mbnbR S T U ndod+e,e-e.cJcKcLc@ sbtbubgeheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOePeQevbwbxbybzbAbBb

382 return self._memory_resource.device_id 2%e'e(e)e*e?c+bndod+e,e-e.cJcKcLcgeheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOePeQe

383 _init_mem_attrs(self) 2P Q ^ mbnbR S T U @ sbtbubvbwbxbybzbAbBb

384 return self._mem_attrs.device_id 2P Q ^ mbnbR S T U @ sbtbubvbwbxbybzbAbBb

385  

386 @property 

387 def handle(self) -> int: 

388 """Return the buffer handle object. 

389  

390 .. caution:: 

391  

392 This handle is a Python object. To get the memory address of the underlying C 

393 handle, call ``int(Buffer.handle)``. 

394 """ 

395 # Return raw integer for compatibility with ctypes and other tools 

396 # that expect a raw pointer value 

397 return as_intptr(self._h_ptr) 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F CdDdG H I J K L V _ ` { | CbDbEbFbGbHbIb%e'e(eM N O hb`c{d{c|d|c}d}c~daeNcbeib~cceadde] eebdfejbkb[ NbObPbQbJbKbablbLbMbdbebpbqbfbgb)e*e]d^dMd[c]cedgda b c /c:c;cW X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = PcEcqcOc+bP Q R S `bRbSb{bTb|b}b~bUbVbWbXbYbZbacbc0b1b2b3bcc4b5bdc6becfcgc7b8b9b!b#b$bhcic%b'b(b)bDcFcWd? ~ Gc+e,e-eHc,cIcLcd 2eMcydzdAd@ sbtbubgeheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOePeQevbOfwbxbybzbAbBb

398  

399 def __eq__(self, other: object) -> bool: 

400 if not isinstance(other, Buffer): 22eMc:e;e=e?e@e[e]e^e_e`e{e|e}e~eafbfcfdfefffgfhfifjf/e#e$e

401 return NotImplemented 22e:e;e=e?e@e[e]e^e_e`e{e|e}e~eafbfcfdfefffgfhfifjf

402 cdef Buffer other_buf = <Buffer>other 22eMc/e#e$e

403 return (as_intptr(self._h_ptr) == as_intptr(other_buf._h_ptr) and 22eMc/e#e$e

404 self._size == other_buf._size) 22eMc#e$e

405  

406 def __hash__(self) -> int: 

407 return hash((as_intptr(self._h_ptr), self._size)) 2McmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNf#e$e

408  

409 def __repr__(self) -> str: 

410 maybe_is_mapped = " is_mapped=True" if self.is_mapped else "" 2NbOb6d7dEdFd8dkdGdHdPbQbJbKbablbLbMbIdJdKdLd.e

411 return f"<Buffer ptr={as_intptr(self._h_ptr):#x} size={self._size}{maybe_is_mapped}>" 2NbOb6d7dEdFd8dkdGdHdPbQbJbKbablbLbMbIdJdKdLd.e

412  

413 @property 

414 def is_device_accessible(self) -> bool: 

415 """Return True if this buffer can be accessed by the GPU, otherwise False.""" 

416 if self._memory_resource is not None: 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = Occd?cdd} bb+bP Q ^ mbnbR S T U Dc? ~ @c.c+cd @ sbtbubgeheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOePeQevbwbxbybzbAbBb

417 return self._memory_resource.is_device_accessible 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = Occd?cdd} bb+bDc? ~ @c.c+cd geheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLeMeNeOePeQe

418 _init_mem_attrs(self) 2P Q ^ mbnbR S T U @ sbtbubvbwbxbybzbAbBb

419 return self._mem_attrs.is_device_accessible 2P Q ^ mbnbR S T U @ sbtbubvbwbxbybzbAbBb

420  

421 @property 

422 def is_host_accessible(self) -> bool: 

423 """Return True if this buffer can be accessed by the CPU, otherwise False.""" 

424 if self._memory_resource is not None: 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = Occd?cdd} bb+bP Q ^ mbnbR S T U jc,b-bkc.blcmcnc/b:b;b=b?b@bocpc[b]b^b_b`bRbSb{bTb|b}b~bUbVbWbXbYbZbacbc0b1b2b3bcc4b5bdc6becfcgc7b8b9b!b#b$bhcic%b'b(b)bDc? ~ @c.c+cd @

425 return self._memory_resource.is_host_accessible 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = Occd?cdd} bb+bjc,b-bkc.blcmcnc/b:b;b=b?b@bocpc[b]b^b_b`bRbSb{bTb|b}b~bUbVbWbXbYbZbacbc0b1b2b3bcc4b5bdc6becfcgc7b8b9b!b#b$bhcic%b'b(b)bDc? ~ @c.c+cd

426 _init_mem_attrs(self) 2P Q ^ mbnbR S T U @

427 return self._mem_attrs.is_host_accessible 2P Q ^ mbnbR S T U @

428  

429 @property 

430 def is_managed(self) -> bool: 

431 """Return True if this buffer is CUDA managed (unified) memory, otherwise False.""" 

432 _init_mem_attrs(self) 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O rbhb`c{c|c}cpdqdrdib~cadsdtd] udbdjbkb[ a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = } bb? ~ cbobd

433 if self._mem_attrs.is_managed: 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O rbhb`c{c|c}cpdqdrdib~cadsdtd] udbdjbkb[ a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = } bb? ~ cbobd

434 return True 2rbhb`c{c|c}cpdqdrdib~cadsdtd] udbdjbkbbb? ~

435 # Pool-allocated managed memory does not set CU_POINTER_ATTRIBUTE_IS_MANAGED, 

436 # so fall back to the memory resource when it advertises managed allocations. 

437 return self._memory_resource is not None and self._memory_resource.is_managed 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O [ a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = } cbobd

438  

439 @property 

440 def is_mapped(self) -> bool: 

441 """Return True if this buffer is mapped into the process via IPC.""" 

442 return getattr(self._ipc_data, "is_mapped", False) 2NbOb6d7dEdFd8dkdGdHdPbQbJbKbablbLbMbIdJdKdLdDc.e

443  

444  

445 @property 

446 def memory_resource(self) -> MemoryResource: 

447 """Return the memory resource associated with this buffer.""" 

448 return self._memory_resource 2_ ` { | CbDbEbFbGbHbIbReSeTeUeVeWe3e4eNbOb6d7dXe5eYe6eZe7e0e8e1e9eBd!eEdFd8dkdGdHdPbQbJbKbablbLbMbIdJdKdLddbebpbqbfbgbPcDcFc@cGchd.cHc+cjdJcKc^c_csbtbubgeheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLekfMeNelfOePeQevbwbxbybzbAbBb

449  

450 @property 

451 def size(self) -> int: 

452 """Return the memory size of this buffer.""" 

453 return self._size 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V _ ` { | CbDbEbFbGbHbIb%e'e(eM N O hb`c{d{c|d|c}d}c~daeNcbeib~cceadde] eebdfejbkb[ ReSeTeUeVeWe3e4eNbOb6d7dXe5eYe6eZe7e0e8e1e9eBd!eEdFd8dkdGdHdPbQbJbKbablbLbMbIdJdKdLddbebpbqbfbgb)e*e[c]cNdedfda b c /c:c;cW X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = Oc+bDcndodFcWd? ~ @cGc+e,e-e.cHc+c,cJcKcIcLcd Mc^c_cydOdPdQdRdSdTdUdVdzdAdgeheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLekfMeNelfOePeQe

454  

455 @property 

456 def owner(self) -> object: 

457 """Return the object holding external allocation.""" 

458 return self._owner 

459  

460  

461# Memory Attribute Query Helpers 

462# ------------------------------ 

463cdef inline void _init_mem_attrs(Buffer self): 

464 """Initialize memory attributes by querying the pointer.""" 

465 if not self._mem_attrs_inited.load(memory_order_acquire): 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O rbhb`c{c|c}cpdqdrdib~cadsdtd] udbdjbkb[ a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = } bbP Q ^ mbnbR S T U ? ~ cbobd @ sbtbubvbwbxbybzbAbBb

466 _query_memory_attrs(self._mem_attrs, as_cu(self._h_ptr)) 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O rbhb`c{c|c}cpdqdrdib~cadsdtd] udbdjbkb[ a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = } bbP Q ^ mbnbR S T U ? ~ cbobd @ sbtbubvbwbxbybzbAbBb

467 self._mem_attrs_inited.store(True, memory_order_release) 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O rbhb`c{c|c}cpdqdrdib~cadsdtd] udbdjbkb[ a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = } bbP Q ^ mbnbR S T U ? ~ cbobd @ sbtbubvbwbxbybzbAbBb

468  

469  

470cdef inline int _query_memory_attrs( 

471 _MemAttrs& out, 

472 cydriver.CUdeviceptr ptr 

473) except -1 nogil: 

474 """Query memory attributes for a device pointer.""" 

475 cdef unsigned int memory_type = 0 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O rbhb`c{c|c}cpdqdrdib~cadsdtd] udbdjbkb[ a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = } bbP Q ^ mbnbR S T U ? ~ cbobd @ sbtbubvbwbxbybzbAbBb

476 cdef int is_managed = 0 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O rbhb`c{c|c}cpdqdrdib~cadsdtd] udbdjbkb[ a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = } bbP Q ^ mbnbR S T U ? ~ cbobd @ sbtbubvbwbxbybzbAbBb

477 cdef int device_id = 0 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O rbhb`c{c|c}cpdqdrdib~cadsdtd] udbdjbkb[ a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = } bbP Q ^ mbnbR S T U ? ~ cbobd @ sbtbubvbwbxbybzbAbBb

478 cdef cydriver.CUpointer_attribute attrs[3] 

479 cdef uintptr_t vals[3] 

480  

481 attrs[0] = cydriver.CUpointer_attribute.CU_POINTER_ATTRIBUTE_MEMORY_TYPE 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O rbhb`c{c|c}cpdqdrdib~cadsdtd] udbdjbkb[ a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = } bbP Q ^ mbnbR S T U ? ~ cbobd @ sbtbubvbwbxbybzbAbBb

482 attrs[1] = cydriver.CUpointer_attribute.CU_POINTER_ATTRIBUTE_IS_MANAGED 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O rbhb`c{c|c}cpdqdrdib~cadsdtd] udbdjbkb[ a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = } bbP Q ^ mbnbR S T U ? ~ cbobd @ sbtbubvbwbxbybzbAbBb

483 attrs[2] = cydriver.CUpointer_attribute.CU_POINTER_ATTRIBUTE_DEVICE_ORDINAL 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O rbhb`c{c|c}cpdqdrdib~cadsdtd] udbdjbkb[ a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = } bbP Q ^ mbnbR S T U ? ~ cbobd @ sbtbubvbwbxbybzbAbBb

484 vals[0] = <uintptr_t><void*>&memory_type 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O rbhb`c{c|c}cpdqdrdib~cadsdtd] udbdjbkb[ a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = } bbP Q ^ mbnbR S T U ? ~ cbobd @ sbtbubvbwbxbybzbAbBb

485 vals[1] = <uintptr_t><void*>&is_managed 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O rbhb`c{c|c}cpdqdrdib~cadsdtd] udbdjbkb[ a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = } bbP Q ^ mbnbR S T U ? ~ cbobd @ sbtbubvbwbxbybzbAbBb

486 vals[2] = <uintptr_t><void*>&device_id 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O rbhb`c{c|c}cpdqdrdib~cadsdtd] udbdjbkb[ a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = } bbP Q ^ mbnbR S T U ? ~ cbobd @ sbtbubvbwbxbybzbAbBb

487  

488 cdef cydriver.CUresult ret 

489 ret = cydriver.cuPointerGetAttributes(3, attrs, <void**>vals, ptr) 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O rbhb`c{c|c}cpdqdrdib~cadsdtd] udbdjbkb[ a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = } bbP Q ^ mbnbR S T U ? ~ cbobd @ sbtbubvbwbxbybzbAbBb

490 if ret == cydriver.CUresult.CUDA_ERROR_NOT_INITIALIZED: 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O rbhb`c{c|c}cpdqdrdib~cadsdtd] udbdjbkb[ a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = } bbP Q ^ mbnbR S T U ? ~ cbobd @ sbtbubvbwbxbybzbAbBb

491 with cython.gil: 

492 # Device class handles the cuInit call internally 

493 Device() 

494 ret = cydriver.cuPointerGetAttributes(3, attrs, <void**>vals, ptr) 

495 HANDLE_RETURN(ret) 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O rbhb`c{c|c}cpdqdrdib~cadsdtd] udbdjbkb[ a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = } bbP Q ^ mbnbR S T U ? ~ cbobd @ sbtbubvbwbxbybzbAbBb

496  

497 # TODO: HMM/ATS-enabled sysmem should also report is_managed=True; the 

498 # CU_POINTER_ATTRIBUTE_IS_MANAGED query does not capture that yet. 

499 out.is_managed = is_managed != 0 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O rbhb`c{c|c}cpdqdrdib~cadsdtd] udbdjbkb[ a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = } bbP Q ^ mbnbR S T U ? ~ cbobd @ sbtbubvbwbxbybzbAbBb

500  

501 if memory_type == 0: 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O rbhb`c{c|c}cpdqdrdib~cadsdtd] udbdjbkb[ a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = } bbP Q ^ mbnbR S T U ? ~ cbobd @ sbtbubvbwbxbybzbAbBb

502 # unregistered host pointer 

503 out.is_host_accessible = True 2^ T U sbtbubvbwbxbybzbAbBb

504 out.is_device_accessible = False 2^ T U sbtbubvbwbxbybzbAbBb

505 out.device_id = -1 2^ T U sbtbubvbwbxbybzbAbBb

506 elif ( 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O rbhb`c{c|c}cpdqdrdib~cadsdtd] udbdjbkb[ a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = } bbP Q mbnbR S T U ? ~ cbobd @

507 is_managed 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O rbhb`c{c|c}cpdqdrdib~cadsdtd] udbdjbkb[ a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = } bbP Q mbnbR S T U ? ~ cbobd @

508 or memory_type == cydriver.CUmemorytype.CU_MEMORYTYPE_HOST 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O [ a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = } P Q R S T U cbobd @

509 ): 

510 # Managed memory or pinned host memory 

511 out.is_host_accessible = True 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O rbhb`c{c|c}cpdqdrdib~cadsdtd] udbdjbkba b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = } bbmbnbR S T U ? ~ obd

512 out.is_device_accessible = True 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O rbhb`c{c|c}cpdqdrdib~cadsdtd] udbdjbkba b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = } bbmbnbR S T U ? ~ obd

513 out.device_id = device_id 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O rbhb`c{c|c}cpdqdrdib~cadsdtd] udbdjbkba b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = } bbmbnbR S T U ? ~ obd

514 elif memory_type == cydriver.CUmemorytype.CU_MEMORYTYPE_DEVICE: 2[ P Q cb@

515 out.is_host_accessible = False 2[ P Q cb@

516 out.is_device_accessible = True 2[ P Q cb@

517 out.device_id = device_id 2[ P Q cb@

518 else: 

519 with cython.gil: 

520 raise ValueError(f"Unsupported memory type: {memory_type}") 

521 return 0 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O rbhb`c{c|c}cpdqdrdib~cadsdtd] udbdjbkb[ a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = } bbP Q ^ mbnbR S T U ? ~ cbobd @ sbtbubvbwbxbybzbAbBb

522  

523  

524cdef class MemoryResource: 

525 """Abstract base class for memory resources that manage allocation and 

526 deallocation of buffers. 

527  

528 Subclasses must implement methods for allocating and deallocation, as well 

529 as properties associated with this memory resource from which all allocated 

530 buffers will inherit. (Since all :class:`Buffer` instances allocated and 

531 returned by the :meth:`allocate` method would hold a reference to self, the 

532 buffer properties are retrieved simply by looking up the underlying memory 

533 resource's respective property.) 

534 """ 

535  

536 def allocate(self, size_t size, *, stream: Stream | GraphBuilder) -> Buffer: 

537 """Allocate a buffer of the requested size. 

538  

539 Parameters 

540 ---------- 

541 size : int 

542 The size of the buffer to allocate, in bytes. 

543 stream : :obj:`~_stream.Stream` | :obj:`~graph.GraphBuilder` 

544 Keyword-only. The stream on which to perform the allocation 

545 asynchronously. Must be passed explicitly; pass 

546 ``device.default_stream`` to use the default stream. 

547  

548 Returns 

549 ------- 

550 Buffer 

551 The allocated buffer object, which can be used for device or host operations 

552 depending on the resource's properties. 

553 """ 

554 raise TypeError("MemoryResource.allocate must be implemented by subclasses.") 

555  

556 def deallocate( 

557 self, 

558 ptr: DevicePointerType, 

559 size_t size, 

560 *, 

561 stream: Stream | GraphBuilder 

562 ) -> None: 

563 """Deallocate a buffer previously allocated by this resource. 

564  

565 Parameters 

566 ---------- 

567 ptr : :obj:`~_memory.DevicePointerType` 

568 The pointer or handle to the buffer to deallocate. 

569 size : int 

570 The size of the buffer to deallocate, in bytes. 

571 stream : :obj:`~_stream.Stream` | :obj:`~graph.GraphBuilder` 

572 Keyword-only. The stream on which to perform the deallocation 

573 asynchronously. Must be passed explicitly; pass 

574 ``device.default_stream`` to use the default stream. 

575 """ 

576 raise TypeError("MemoryResource.deallocate must be implemented by subclasses.") 

577  

578 @property 

579 def is_device_accessible(self) -> bool: 

580 """Whether buffers allocated by this resource are device-accessible.""" 

581 raise TypeError("MemoryResource.is_device_accessible must be implemented by subclasses.") 

582  

583 @property 

584 def is_host_accessible(self) -> bool: 

585 """Whether buffers allocated by this resource are host-accessible.""" 

586 raise TypeError("MemoryResource.is_host_accessible must be implemented by subclasses.") 

587  

588 @property 

589 def is_managed(self) -> bool: 

590 """Whether buffers allocated by this resource are CUDA managed (unified) memory.""" 

591 return False 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L V M N O a b c W X Y Z 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = } cbobd

592  

593 @property 

594 def device_id(self) -> int: 

595 """Device ID associated with this memory resource, or -1 if not applicable.""" 

596 raise TypeError("MemoryResource.device_id must be implemented by subclasses.") 

597  

598  

599# Buffer Implementation Helpers 

600# ----------------------------- 

601cdef Buffer Buffer_from_deviceptr_handle( 

602 DevicePtrHandle h_ptr, 

603 size_t size, 

604 MemoryResource mr, 

605 object ipc_descriptor = None, 

606 type cls = Buffer, 

607): 

608 """Create a Buffer (or subclass instance) from an existing DevicePtrHandle.""" 

609 cdef Buffer buf = cls.__new__(cls) 2CdDdXdYdZdPfQfRf_ ` { | CbDbEbFbGbHbIb%e'e(evdwdxdrbhb0dSfibTfUfjbkb1d2d3d4d5dReSeTeUeVeWe3e4eNbOb6d7dXe5eYe6eZe7e0e8e1e9eBd!eEdFd8dkdGdHdPbQbJbKbablbLbMbIdJdKdLddbebpbqbfbgb)e*e9dVfMd!d[cld]cNdedfdgdmda b c P Q ndodFc~ @cGc+e,e-e#d$d%d'd(d)d*d+d,d-d.d/d:dhdcbob.cHc+cjdd 2eMcmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLf:e;e=e?e@e[e]e^e_e`e{e|e}e~eafbfcfdfefffgfhfifjf^c_c.e/eMfNf#e$eWfXfydOdPd;dQdRdSdTd=d?d@dUd[dVdzdAd@ geheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLekfYfZfMeNelfOePeQeOf

610 buf._h_ptr = h_ptr 2CdDdXdYdZdPfQfRf_ ` { | CbDbEbFbGbHbIb%e'e(evdwdxdrbhb0dSfibTfUfjbkb1d2d3d4d5dReSeTeUeVeWe3e4eNbOb6d7dXe5eYe6eZe7e0e8e1e9eBd!eEdFd8dkdGdHdPbQbJbKbablbLbMbIdJdKdLddbebpbqbfbgb)e*e9dVfMd!d[cld]cNdedfdgdmda b c P Q ndodFc~ @cGc+e,e-e#d$d%d'd(d)d*d+d,d-d.d/d:dhdcbob.cHc+cjdd 2eMcmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLf:e;e=e?e@e[e]e^e_e`e{e|e}e~eafbfcfdfefffgfhfifjf^c_c.e/eMfNf#e$eWfXfydOdPd;dQdRdSdTd=d?d@dUd[dVdzdAd@ geheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLekfYfZfMeNelfOePeQeOf

611 buf._size = size 2CdDdXdYdZdPfQfRf_ ` { | CbDbEbFbGbHbIb%e'e(evdwdxdrbhb0dSfibTfUfjbkb1d2d3d4d5dReSeTeUeVeWe3e4eNbOb6d7dXe5eYe6eZe7e0e8e1e9eBd!eEdFd8dkdGdHdPbQbJbKbablbLbMbIdJdKdLddbebpbqbfbgb)e*e9dVfMd!d[cld]cNdedfdgdmda b c P Q ndodFc~ @cGc+e,e-e#d$d%d'd(d)d*d+d,d-d.d/d:dhdcbob.cHc+cjdd 2eMcmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLf:e;e=e?e@e[e]e^e_e`e{e|e}e~eafbfcfdfefffgfhfifjf^c_c.e/eMfNf#e$eWfXfydOdPd;dQdRdSdTd=d?d@dUd[dVdzdAd@ geheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLekfYfZfMeNelfOePeQeOf

612 buf._memory_resource = mr 2CdDdXdYdZdPfQfRf_ ` { | CbDbEbFbGbHbIb%e'e(evdwdxdrbhb0dSfibTfUfjbkb1d2d3d4d5dReSeTeUeVeWe3e4eNbOb6d7dXe5eYe6eZe7e0e8e1e9eBd!eEdFd8dkdGdHdPbQbJbKbablbLbMbIdJdKdLddbebpbqbfbgb)e*e9dVfMd!d[cld]cNdedfdgdmda b c P Q ndodFc~ @cGc+e,e-e#d$d%d'd(d)d*d+d,d-d.d/d:dhdcbob.cHc+cjdd 2eMcmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLf:e;e=e?e@e[e]e^e_e`e{e|e}e~eafbfcfdfefffgfhfifjf^c_c.e/eMfNf#e$eWfXfydOdPd;dQdRdSdTd=d?d@dUd[dVdzdAd@ geheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLekfYfZfMeNelfOePeQeOf

613 buf._ipc_data = IPCDataForBuffer(ipc_descriptor, True) if ipc_descriptor is not None else None 2CdDdXdYdZdPfQfRf_ ` { | CbDbEbFbGbHbIb%e'e(evdwdxdrbhb0dSfibTfUfjbkb1d2d3d4d5dReSeTeUeVeWe3e4eNbOb6d7dXe5eYe6eZe7e0e8e1e9eBd!eEdFd8dkdGdHdPbQbJbKbablbLbMbIdJdKdLddbebpbqbfbgb)e*e9dVfMd!d[cld]cNdedfdgdmda b c P Q ndodFc~ @cGc+e,e-e#d$d%d'd(d)d*d+d,d-d.d/d:dhdcbob.cHc+cjdd 2eMcmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLf:e;e=e?e@e[e]e^e_e`e{e|e}e~eafbfcfdfefffgfhfifjf^c_c.e/eMfNf#e$eWfXfydOdPd;dQdRdSdTd=d?d@dUd[dVdzdAd@ geheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLekfYfZfMeNelfOePeQeOf

614 buf._owner = None 2CdDdXdYdZdPfQfRf_ ` { | CbDbEbFbGbHbIb%e'e(evdwdxdrbhb0dSfibTfUfjbkb1d2d3d4d5dReSeTeUeVeWe3e4eNbOb6d7dXe5eYe6eZe7e0e8e1e9eBd!eEdFd8dkdGdHdPbQbJbKbablbLbMbIdJdKdLddbebpbqbfbgb)e*e9dVfMd!d[cld]cNdedfdgdmda b c P Q ndodFc~ @cGc+e,e-e#d$d%d'd(d)d*d+d,d-d.d/d:dhdcbob.cHc+cjdd 2eMcmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLf:e;e=e?e@e[e]e^e_e`e{e|e}e~eafbfcfdfefffgfhfifjf^c_c.e/eMfNf#e$eWfXfydOdPd;dQdRdSdTd=d?d@dUd[dVdzdAd@ geheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLekfYfZfMeNelfOePeQeOf

615 buf._mem_attrs_inited.store(False) 2CdDdXdYdZdPfQfRf_ ` { | CbDbEbFbGbHbIb%e'e(evdwdxdrbhb0dSfibTfUfjbkb1d2d3d4d5dReSeTeUeVeWe3e4eNbOb6d7dXe5eYe6eZe7e0e8e1e9eBd!eEdFd8dkdGdHdPbQbJbKbablbLbMbIdJdKdLddbebpbqbfbgb)e*e9dVfMd!d[cld]cNdedfdgdmda b c P Q ndodFc~ @cGc+e,e-e#d$d%d'd(d)d*d+d,d-d.d/d:dhdcbob.cHc+cjdd 2eMcmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLf:e;e=e?e@e[e]e^e_e`e{e|e}e~eafbfcfdfefffgfhfifjf^c_c.e/eMfNf#e$eWfXfydOdPd;dQdRdSdTd=d?d@dUd[dVdzdAd@ geheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLekfYfZfMeNelfOePeQeOf

616 return buf 2CdDdXdYdZdPfQfRf_ ` { | CbDbEbFbGbHbIb%e'e(evdwdxdrbhb0dSfibTfUfjbkb1d2d3d4d5dReSeTeUeVeWe3e4eNbOb6d7dXe5eYe6eZe7e0e8e1e9eBd!eEdFd8dkdGdHdPbQbJbKbablbLbMbIdJdKdLddbebpbqbfbgb)e*e9dVfMd!d[cld]cNdedfdgdmda b c P Q ndodFc~ @cGc+e,e-e#d$d%d'd(d)d*d+d,d-d.d/d:dhdcbob.cHc+cjdd 2eMcmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLf:e;e=e?e@e[e]e^e_e`e{e|e}e~eafbfcfdfefffgfhfifjf^c_c.e/eMfNf#e$eWfXfydOdPd;dQdRdSdTd=d?d@dUd[dVdzdAd@ geheiejekelemeneoepeqereseteuevewexeyezeAeBeCeDeEeFeGeHeIeJeKeLekfYfZfMeNelfOePeQeOf

617  

618  

619cdef inline void Buffer_close(Buffer self, object stream): 

620 """Close a buffer, freeing its memory.""" 

621 cdef Stream s 

622 if not self._h_ptr: 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L XdYdZd_ ` { | CbDbEbFbGbHbIbvdwdxdM N O rbhb0f1f2f3f4f0dNc5f!fib6f#f7f$f] 8f9fjbkb1d2d3d4d5d[ ablbdbebpbqbfbgb9dMd!d[cld]cNdedfdgdmdPcEcqcP Q ^ R S T U QcRcjcrc,bScsc-bkcTcUcVc.bWclcmcnc/b:b;b=b?b@bXcocpc[b]btc^b_bucYcZc0c`bvcRb1cwcSb{b2c3c4cTb5c|b}b~bUbVbWbXbYbZb6cacbc0b1bxc2b3byc7c8c9ccczc4b!cAc5bdc#c$c%c6b'cecfcgc7b8b9b!b#b$b(chcic%b'bBc(b)bCc)cDcndodFc@cGc#d$d%d'd(d)d*d+d,d-d.d/d:dhd=c*ccbobid.cHc+cjd,c-cJcKcIcLc^c_cydOdPd;dQdRdSdTd=d?d@dUd[dVdzdAd

623 return 

624 # Update deallocation stream if provided 

625 if stream is not None: 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L XdYdZd_ ` { | CbDbEbFbGbHbIbvdwdxdM N O rbhb0f1f2f3f4f0dNc5f!fib6f#f7f$f] 8f9fjbkb1d2d3d4d5d[ ablbdbebpbqbfbgb9dMd!d[cld]cNdedfdgdmdPcEcqcP Q ^ R S T U QcRcjcrc,bScsc-bkcTcUcVc.bWclcmcnc/b:b;b=b?b@bXcocpc[b]btc^b_bucYcZc0c`bvcRb1cwcSb{b2c3c4cTb5c|b}b~bUbVbWbXbYbZb6cacbc0b1bxc2b3byc7c8c9ccczc4b!cAc5bdc#c$c%c6b'cecfcgc7b8b9b!b#b$b(chcic%b'bBc(b)bCc)cDcndodFc@cGc#d$d%d'd(d)d*d+d,d-d.d/d:dhd=c*ccbobid.cHc+cjd,c-cJcKcIcLc^c_cydOdPd;dQdRdSdTd=d?d@dUd[dVdzdAd

626 s = Stream_accept(stream) 2vdwdxdedFcGc*cHc-c

627 set_deallocation_stream(self._h_ptr, s._h_stream) 2vdwdxdedFcGc*cHc-c

628 # Reset handle - RAII deleter will free the memory (and release owner ref in C++) 

629 self._h_ptr.reset() 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L XdYdZd_ ` { | CbDbEbFbGbHbIbvdwdxdM N O rbhb0f1f2f3f4f0dNc5f!fib6f#f7f$f] 8f9fjbkb1d2d3d4d5d[ ablbdbebpbqbfbgb9dMd!d[cld]cNdedfdgdmdPcEcqcP Q ^ R S T U QcRcjcrc,bScsc-bkcTcUcVc.bWclcmcnc/b:b;b=b?b@bXcocpc[b]btc^b_bucYcZc0c`bvcRb1cwcSb{b2c3c4cTb5c|b}b~bUbVbWbXbYbZb6cacbc0b1bxc2b3byc7c8c9ccczc4b!cAc5bdc#c$c%c6b'cecfcgc7b8b9b!b#b$b(chcic%b'bBc(b)bCc)cDcndodFc@cGc#d$d%d'd(d)d*d+d,d-d.d/d:dhd=c*ccbobid.cHc+cjd,c-cJcKcIcLc^c_cydOdPd;dQdRdSdTd=d?d@dUd[dVdzdAd

630 self._size = 0 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L XdYdZd_ ` { | CbDbEbFbGbHbIbvdwdxdM N O rbhb0f1f2f3f4f0dNc5f!fib6f#f7f$f] 8f9fjbkb1d2d3d4d5d[ ablbdbebpbqbfbgb9dMd!d[cld]cNdedfdgdmdPcEcqcP Q ^ R S T U QcRcjcrc,bScsc-bkcTcUcVc.bWclcmcnc/b:b;b=b?b@bXcocpc[b]btc^b_bucYcZc0c`bvcRb1cwcSb{b2c3c4cTb5c|b}b~bUbVbWbXbYbZb6cacbc0b1bxc2b3byc7c8c9ccczc4b!cAc5bdc#c$c%c6b'cecfcgc7b8b9b!b#b$b(chcic%b'bBc(b)bCc)cDcndodFc@cGc#d$d%d'd(d)d*d+d,d-d.d/d:dhd=c*ccbobid.cHc+cjd,c-cJcKcIcLc^c_cydOdPd;dQdRdSdTd=d?d@dUd[dVdzdAd

631 self._memory_resource = None 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L XdYdZd_ ` { | CbDbEbFbGbHbIbvdwdxdM N O rbhb0f1f2f3f4f0dNc5f!fib6f#f7f$f] 8f9fjbkb1d2d3d4d5d[ ablbdbebpbqbfbgb9dMd!d[cld]cNdedfdgdmdPcEcqcP Q ^ R S T U QcRcjcrc,bScsc-bkcTcUcVc.bWclcmcnc/b:b;b=b?b@bXcocpc[b]btc^b_bucYcZc0c`bvcRb1cwcSb{b2c3c4cTb5c|b}b~bUbVbWbXbYbZb6cacbc0b1bxc2b3byc7c8c9ccczc4b!cAc5bdc#c$c%c6b'cecfcgc7b8b9b!b#b$b(chcic%b'bBc(b)bCc)cDcndodFc@cGc#d$d%d'd(d)d*d+d,d-d.d/d:dhd=c*ccbobid.cHc+cjd,c-cJcKcIcLc^c_cydOdPd;dQdRdSdTd=d?d@dUd[dVdzdAd

632 self._ipc_data = None 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L XdYdZd_ ` { | CbDbEbFbGbHbIbvdwdxdM N O rbhb0f1f2f3f4f0dNc5f!fib6f#f7f$f] 8f9fjbkb1d2d3d4d5d[ ablbdbebpbqbfbgb9dMd!d[cld]cNdedfdgdmdPcEcqcP Q ^ R S T U QcRcjcrc,bScsc-bkcTcUcVc.bWclcmcnc/b:b;b=b?b@bXcocpc[b]btc^b_bucYcZc0c`bvcRb1cwcSb{b2c3c4cTb5c|b}b~bUbVbWbXbYbZb6cacbc0b1bxc2b3byc7c8c9ccczc4b!cAc5bdc#c$c%c6b'cecfcgc7b8b9b!b#b$b(chcic%b'bBc(b)bCc)cDcndodFc@cGc#d$d%d'd(d)d*d+d,d-d.d/d:dhd=c*ccbobid.cHc+cjd,c-cJcKcIcLc^c_cydOdPd;dQdRdSdTd=d?d@dUd[dVdzdAd

633 self._owner = None 2e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L XdYdZd_ ` { | CbDbEbFbGbHbIbvdwdxdM N O rbhb0f1f2f3f4f0dNc5f!fib6f#f7f$f] 8f9fjbkb1d2d3d4d5d[ ablbdbebpbqbfbgb9dMd!d[cld]cNdedfdgdmdPcEcqcP Q ^ R S T U QcRcjcrc,bScsc-bkcTcUcVc.bWclcmcnc/b:b;b=b?b@bXcocpc[b]btc^b_bucYcZc0c`bvcRb1cwcSb{b2c3c4cTb5c|b}b~bUbVbWbXbYbZb6cacbc0b1bxc2b3byc7c8c9ccczc4b!cAc5bdc#c$c%c6b'cecfcgc7b8b9b!b#b$b(chcic%b'bBc(b)bCc)cDcndodFc@cGc#d$d%d'd(d)d*d+d,d-d.d/d:dhd=c*ccbobid.cHc+cjd,c-cJcKcIcLc^c_cydOdPd;dQdRdSdTd=d?d@dUd[dVdzdAd