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

306 statements  

« prev     ^ index     » next       coverage.py v7.16.0, created at 2026-09-03 02:41 +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 

9from libcpp.atomic cimport memory_order_acquire, memory_order_release 

10  

11from cuda.bindings cimport cydriver 

12from cuda.core._memory._device_memory_resource import DeviceMemoryResource 

13from cuda.core._memory._pinned_memory_resource import PinnedMemoryResource 

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

15from cuda.core._memory cimport _ipc 

16from cuda.core._resource_handles cimport ( 

17 DevicePtrHandle, 

18 StreamHandle, 

19 ContextHandle, 

20 deviceptr_create_with_owner, 

21 deviceptr_create_with_mr, 

22 register_mr_dealloc_callback, 

23 as_intptr, 

24 as_cu, 

25 get_current_context, 

26 set_deallocation_stream, 

27) 

28from cuda.core.typing import DevicePointerType 

29  

30from cuda.core._memory._copy_attributes cimport _with_attributes_available 

31from cuda.core._memory._copy_attributes cimport _to_cu_memcpy_attributes # no-cython-lint 

32  

33IF CUDA_CORE_BUILD_MAJOR >= 13: 

34 from cuda.core._resource_handles cimport memcpy_with_attributes_async 

35  

36from cuda.core._stream cimport Stream, Stream_accept, Stream_is_legacy_default_token, default_stream 

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

38  

39import sys 

40from collections.abc import Sequence 

41from typing import TYPE_CHECKING 

42  

43from cuda.core._memory._copy_enums import CopyOptions, _reject_unsupported_during_api_call 

44from cuda.core._utils.pycompat import BufferProtocol 

45from cuda.core._dlpack import classify_dl_device, make_py_capsule 

46from cuda.core._device import Device 

47  

48if TYPE_CHECKING: 

49 from cuda.core.graph import GraphBuilder 

50  

51  

52# ============================================================================= 

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

54# ============================================================================= 

55  

56cdef void _mr_dealloc_callback( 

57 object mr, 

58 cydriver.CUdeviceptr ptr, 

59 size_t size, 

60 const StreamHandle& h_stream, 

61) noexcept: 

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

63 cdef Stream stream 

64 try: 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' OhUbPh6bQh5 6 7 Rhn Sh8 ThUhVh( Wh9 Xh7bYhk l m ! 8bZh9b0h!b1h#b2h3h4h5h6h7h8h9h!h1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb@h[h]h^h_h{d`h{h|hZb}h~hMbrisitiuiviwixiyiziAiBiCiDiDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p # $ ~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFd@dtd1g+gKeQeAg2gBg3g)f) Fe*fGdAeGeudBeHe:d[d]d;d=dd e f *hEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4i5i6i7i8i9i!i#i$i%i'i(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/dRe

65 if not h_stream: 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' OhUbPh6bQh5 6 7 Rhn Sh8 ThUhVh( Wh9 Xh7bYhk l m ! 8bZh9b0h!b1h#b2h3h4h5h6h7h8h9h!h1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb@h[h]h^h_h{d`h{h|hZb}h~hMbrisitiuiviwixiyiziAiBiCiDiDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p # $ ~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFd@dtd1g+gKeQeAg2gBg3g)f) Fe*fGdAeGeudBeHe:d[d]d;d=dd e f *hEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4i5i6i7i8i9i!i#i$i%i'i(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/dRe

66 print( 21g+g

67 "Warning: no deallocation stream was recorded; falling back to " 

68 "the default stream for mr.deallocate() during Buffer " 

69 "destruction. This is an internal cuda-core error; please " 

70 "report it with your CUDA driver, CUDA Toolkit, and " 

71 "cuda-python versions.", 

72 file=sys.stderr, 21g+g

73 ) 

74 stream = default_stream() 21g+g

75 else: 

76 stream = Stream._from_handle(Stream, h_stream) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' OhUbPh6bQh5 6 7 Rhn Sh8 ThUhVh( Wh9 Xh7bYhk l m ! 8bZh9b0h!b1h#b2h3h4h5h6h7h8h9h!h1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb@h[h]h^h_h{d`h{h|hZb}h~hMbrisitiuiviwixiyiziAiBiCiDiDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p # $ ~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFd@dtdKeQeAg2gBg3g)f) Fe*fGdAeGeudBeHe:d[d]d;d=dd e f *hEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4i5i6i7i8i9i!i#i$i%i'i(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/dRe

77 mr.deallocate(int(ptr), size, stream=stream) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' OhUbPh6bQh5 6 7 Rhn Sh8 ThUhVh( Wh9 Xh7bYhk l m ! 8bZh9b0h!b1h#b2h3h4h5h6h7h8h9h!h1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb@h[h]h^h_h{d`h{h|hZb}h~hMbrisitiuiviwixiyiziAiBiCiDiDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p # $ ~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFd@dtd1g+gKeQeAg2gBg3g)f) Fe*fGdAeGeudBeHe:d[d]d;d=dd e f *hEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4i5i6i7i8i9i!i#i$i%i'i(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/dRe

78 except Exception as exc: 2@bAe;d

79 print(f"Warning: mr.deallocate() failed during Buffer destruction: {exc}", 2Ae;d

80 file=sys.stderr) 2Ae;d

81  

82register_mr_dealloc_callback(_mr_dealloc_callback) 

83  

84  

85cdef inline void _apply_deallocation_stream( 

86 const DevicePtrHandle& h_ptr, const StreamHandle& h_stream) except *: 

87 """Record h_stream as the deallocation stream for h_ptr. 

88  

89 Translates CUDA_ERROR_INVALID_CONTEXT (default-stream token with no current 

90 context) into a descriptive RuntimeError instead of a raw CUDAError. 

91 """ 

92 cdef cydriver.CUresult status = set_deallocation_stream(h_ptr, h_stream) 24e5e6e7e8e9eOhUbPhQh5 6 7 Rhn Sh8 ThUhVhWh9 XhYhk l m ! Zh0h1h2h3h4h5h6h7h8h9h!h1b2bg VbHbh i j WbIb[b:bJbXbYbKbLbYeEdcdJeFd|ctd}cGdud~c:d

93 if status == cydriver.CUresult.CUDA_ERROR_INVALID_CONTEXT: 24e5e6e7e8e9eOhUbPhQh5 6 7 Rhn Sh8 ThUhVhWh9 XhYhk l m ! Zh0h1h2h3h4h5h6h7h8h9h!h1b2bg VbHbh i j WbIb[b:bJbXbYbKbLbYeEdcdJeFd|ctd}cGdud~c:d

94 raise RuntimeError( 2Fd

95 "Cannot record a default deallocation stream when no CUDA context is " 

96 "current. Call Device.set_current() first, or pass stream= with a " 

97 "non-default Stream." 

98 ) 

99 HANDLE_RETURN(status) 24e5e6e7e8e9eOhUbPhQh5 6 7 Rhn Sh8 ThUhVhWh9 XhYhk l m ! Zh0h1h2h3h4h5h6h7h8h9h!h1b2bg VbHbh i j WbIb[b:bJbXbYbKbLbYeEdcdJe|ctd}cGdud~c:d

100  

101  

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

103  

104  

105# Memory Attribute Query Helpers 

106# ------------------------------ 

107cdef inline int _query_memory_attrs( 

108 _MemAttrs& out, 

109 cydriver.CUdeviceptr ptr 

110) except -1 nogil: 

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

112 cdef unsigned int memory_type = 0 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bo p (bfcgc# $ NbOb) ]bjcNcd e f % ;c=c?c@c[c]c^c_c`c{c

113 cdef int is_managed = 0 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bo p (bfcgc# $ NbOb) ]bjcNcd e f % ;c=c?c@c[c]c^c_c`c{c

114 cdef int device_id = 0 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bo p (bfcgc# $ NbOb) ]bjcNcd e f % ;c=c?c@c[c]c^c_c`c{c

115 cdef cydriver.CUpointer_attribute[3] attrs = [ 2@bq r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bo p (bfcgc# $ NbOb) ]bjcNcd e f % ;c=c?c@c[c]c^c_c`c{c

116 cydriver.CUpointer_attribute.CU_POINTER_ATTRIBUTE_MEMORY_TYPE, 

117 cydriver.CUpointer_attribute.CU_POINTER_ATTRIBUTE_IS_MANAGED, 

118 cydriver.CUpointer_attribute.CU_POINTER_ATTRIBUTE_DEVICE_ORDINAL, 

119 ] 

120 cdef uintptr_t[3] vals = [ 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bo p (bfcgc# $ NbOb) ]bjcNcd e f % ;c=c?c@c[c]c^c_c`c{c

121 <uintptr_t><void*>&memory_type, 

122 <uintptr_t><void*>&is_managed, 

123 <uintptr_t><void*>&device_id, 

124 ] 

125  

126 cdef cydriver.CUresult ret 

127 ret = cydriver.cuPointerGetAttributes(3, attrs, <void**>vals, ptr) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bo p (bfcgc# $ NbOb) ]bjcNcd e f % ;c=c?c@c[c]c^c_c`c{c

128 if ret == cydriver.CUresult.CUDA_ERROR_NOT_INITIALIZED: 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bo p (bfcgc# $ NbOb) ]bjcNcd e f % ;c=c?c@c[c]c^c_c`c{c

129 with cython.gil: 

130 # Device class handles the cuInit call internally 

131 Device() 

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

133 HANDLE_RETURN(ret) 2@bq r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bo p (bfcgc# $ NbOb) ]bjcNcd e f % ;c=c?c@c[c]c^c_c`c{c

134  

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

136 # CU_POINTER_ATTRIBUTE_IS_MANAGED query does not capture that yet. 

137 out.is_managed = is_managed != 0 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bo p (bfcgc# $ NbOb) ]bjcNcd e f % ;c=c?c@c[c]c^c_c`c{c

138  

139 if memory_type == 0: 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bo p (bfcgc# $ NbOb) ]bjcNcd e f % ;c=c?c@c[c]c^c_c`c{c

140 # unregistered host pointer 

141 out.is_host_accessible = True 2(bNbOb;c=c?c@c[c]c^c_c`c{c

142 out.is_device_accessible = False 2(bNbOb;c=c?c@c[c]c^c_c`c{c

143 out.device_id = -1 2(bNbOb;c=c?c@c[c]c^c_c`c{c

144 elif ( 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bo p fcgc# $ NbOb) ]bjcNcd e f %

145 is_managed 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bo p fcgc# $ NbOb) ]bjcNcd e f %

146 or memory_type == cydriver.CUmemorytype.CU_MEMORYTYPE_HOST 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 Mb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0bo p # $ NbObjcNcd e f %

147 ): 

148 # Managed memory or pinned host memory 

149 out.is_host_accessible = True 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bfcgc# $ NbOb) ]bNcd e f

150 out.is_device_accessible = True 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bfcgc# $ NbOb) ]bNcd e f

151 out.device_id = device_id 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bfcgc# $ NbOb) ]bNcd e f

152 elif memory_type == cydriver.CUmemorytype.CU_MEMORYTYPE_DEVICE: 2Mb?b'bo p jc%

153 out.is_host_accessible = False 2Mb?b'bo p jc%

154 out.is_device_accessible = True 2Mb?b'bo p jc%

155 out.device_id = device_id 2Mb?b'bo p jc%

156 else: 

157 with cython.gil: 

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

159 return 0 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bo p (bfcgc# $ NbOb) ]bjcNcd e f % ;c=c?c@c[c]c^c_c`c{c

160  

161  

162cdef inline void _init_memory_attrs(Buffer self): 

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

164 Buffer_check_open(self) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bo p (bfcgc# $ NbOb) ]bjcNcd e f % ;c=c?c@c[c]c^c_c`c{c

165 if not self._mem_attrs_inited.load(memory_order_acquire): 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bo p (bfcgc# $ NbOb) ]bjcNcd e f % ;c=c?c@c[c]c^c_c`c{c

166 _query_memory_attrs(self._mem_attrs, as_cu(self._h_ptr)) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bo p (bfcgc# $ NbOb) ]bjcNcd e f % ;c=c?c@c[c]c^c_c`c{c

167 self._mem_attrs_inited.store(True, memory_order_release) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bo p (bfcgc# $ NbOb) ]bjcNcd e f % ;c=c?c@c[c]c^c_c`c{c

168  

169  

170cdef bint _stream_is_capturing(Stream s): 

171 cdef cydriver.CUstreamCaptureStatus cap_status 

172 IF CUDA_CORE_BUILD_MAJOR >= 13: 

173 HANDLE_RETURN(cydriver.cuStreamGetCaptureInfo(as_cu(s._h_stream), &cap_status, 2g VbHbh i j WbkcIbhcJbRbXbYbKbLb

174 NULL, NULL, NULL, NULL, NULL)) 

175 ELSE: 

176 HANDLE_RETURN(cydriver.cuStreamGetCaptureInfo(as_cu(s._h_stream), &cap_status, 

177 NULL, NULL, NULL, NULL)) 

178 return cap_status == cydriver.CU_STREAM_CAPTURE_STATUS_ACTIVE 2g VbHbh i j WbkcIbhcJbRbXbYbKbLb

179  

180  

181cdef void _do_copy_with_attributes( 

182 cydriver.CUdeviceptr dst, cydriver.CUdeviceptr src, size_t nbytes, 

183 object options, cydriver.CUstream hstream, 

184): 

185 IF CUDA_CORE_BUILD_MAJOR >= 13: 

186 # Routed through the memcpy_with_attributes_async() C++ shim since 

187 # cydriver.cuMemcpyWithAttributesAsync is absent from cuda-bindings < 13.2. 

188 cdef cydriver.CUmemcpyAttributes cu_attr = _to_cu_memcpy_attributes(options) 2g VbHbh i j WbIbJbRbXbYbKbLb

189 with nogil: 2g VbHbh i j WbIbJbRbXbYbKbLb

190 HANDLE_RETURN(memcpy_with_attributes_async(dst, src, nbytes, <void*>&cu_attr, hstream)) 2g VbHbh i j WbIbJbRbXbYbKbLb

191 ELSE: 

192 pass # unreachable: _with_attributes_available() is always False on CUDA 12 

193  

194  

195cdef void _dispatch_buffer_copy( 

196 cydriver.CUdeviceptr dst, cydriver.CUdeviceptr src, size_t nbytes, 

197 Stream s, object options, str method_name, 

198): 

199 """Submit a single copy, honoring CopyOptions when the attributes path is usable.""" 

200 if options is None: 2+ , - . )b*b+b,b-b.b/bbc;b' 6b5 6 7 n 8 ( 9 7bk l m ! 8b9b!b#bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGba b c ^d_d`d)cmc|c}c~cd e f

201 with nogil: 2+ , - . )b*b+b,b-b.b/bbc;b' 6b5 6 7 n 8 ( 9 7bk l m ! 8b9b!b#bg h i $bj [b:blc^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGba b c ^d_d`d)cmc|c}c~cd e f

202 HANDLE_RETURN(cydriver.cuMemcpyAsync(dst, src, nbytes, as_cu(s._h_stream))) 2+ , - . )b*b+b,b-b.b/bbc;b' 6b5 6 7 n 8 ( 9 7bk l m ! 8b9b!b#bg h i $bj [b:blc^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGba b c ^d_d`d)cmc|c}c~cd e f

203 return 2+ , - . )b*b+b,b-b.b/bbc;b' 6b5 6 7 n 8 ( 9 7bk l m ! 8b9b!b#bg h i $bj [b:blc^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGba b c ^d_d`d)cmc|c}c~cd e f

204 if not isinstance(options, CopyOptions): 2ccdcecg VbHbh i $bj WbkcIbhcJbRbXbYbKbLb

205 raise TypeError( 2ccdcec

206 f"{method_name}: options must be CopyOptions, got {type(options).__name__}" 2ccdcec

207 ) 

208 if Stream_is_legacy_default_token(s): 2g VbHbh i $bj WbkcIbhcJbRbXbYbKbLb

209 raise TypeError( 2$b

210 f"{method_name} does not accept LEGACY_DEFAULT_STREAM with options " 2$b

211 "(matches copy_batch); cuMemcpyWithAttributesAsync rejects it outright, " 

212 "unlike PER_THREAD_DEFAULT_STREAM, which is a real stream to the driver " 

213 "and is accepted. Pass an explicit stream, PER_THREAD_DEFAULT_STREAM, " 

214 "or options=None." 

215 ) 

216 if _stream_is_capturing(s): 2g VbHbh i j WbkcIbhcJbRbXbYbKbLb

217 raise TypeError( 2kchc

218 f"{method_name} does not support graph capture with options " 2kchc

219 "(matches copy_batch); the driver has no graph-node form of " 

220 "cuMemcpyWithAttributesAsync, so options cannot be honored in a graph. " 

221 "Use GraphNode.memcpy for a plain (non-attributed) copy node, or pass " 

222 "options=None." 

223 ) 

224 if _with_attributes_available(): 2g VbHbh i j WbIbJbRbXbYbKbLb

225 _do_copy_with_attributes(dst, src, nbytes, options, as_cu(s._h_stream)) 2g VbHbh i j WbIbJbRbXbYbKbLb

226 else: 

227 _reject_unsupported_during_api_call( 

228 options.src_access_order, 

229 "cuda.bindings and the driver to both report CUDA 13.2 or newer " 

230 "(cuMemcpyWithAttributesAsync is unavailable here)", 

231 ) 

232 # STREAM and ANY never require access sooner than stream order, so 

233 # cuMemcpyAsync satisfies them; options are otherwise silently 

234 # ignored on this pre-CUDA-13.2 fallback path, matching copy_batch. 

235 with nogil: 

236 HANDLE_RETURN(cydriver.cuMemcpyAsync(dst, src, nbytes, as_cu(s._h_stream))) 

237  

238  

239cdef class Buffer: 

240 """Represent a handle to allocated memory. 

241  

242 This generic object provides a unified representation for how 

243 different memory resources are to give access to their memory 

244 allocations. 

245  

246 Support for data interchange mechanisms are provided by DLPack. 

247  

248 Note 

249 ---- 

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

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

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

253 import. Do not unpickle buffers from untrusted sources. 

254 """ 

255 def __cinit__(self) -> None: 

256 self._clear() 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V /g:g;g=g?gmh,h-h@gVe[g]gWeXe+h^g_gnh`gW X Y Z 0 1 * ohphqh.h/h:h+ , - . )b*b+b,b-b.b/b#h$h%h4e5e6e!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 7e8e9e' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb=b3b4g5g6g7g8grh{d9g;hic!g=h#g?hZb$g%g4b5bZe0eJgKgLgMb{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb|d}dxgygsh#fihMg$fth?bYe[f]f'ba b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@d^f_f|ctd1g+gKeQeAg2gBg3g)f) ]b1e}c'h(h)huhvhwhxhyhzhAhBhChDhEhFhGh%fFe*fGdAeGeudjcNc'fSe~cEe(fHhBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f2e3e3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c

257  

258 def _clear(self) -> None: 

259 self._h_ptr.reset() # Release the handle 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V /g:g;g=g?gmh,h-h@gVe[g]gWeXe+h^g_gnh`gW X Y Z 0 1 * ohphqh.h/h:h+ , - . )b*b+b,b-b.b/b#h$h%h4e5e6e!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 7e8e9e' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb=b3b4g5g6g7g8grh{d9g;hic!g=h#g?hZb$g%g4b5bZe0eJgKgLgMb{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb|d}dxgygsh#fihMg$fth?bYe[f]f'ba b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@d^f_f|ctd1g+gKeQeAg2gBg3g)f) ]b1e}c'h(h)huhvhwhxhyhzhAhBhChDhEhFhGh%fFe*fGdAeGeudjcNc'fSe~cEe(fHhBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f2e3e3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c

260 self._size = 0 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V /g:g;g=g?gmh,h-h@gVe[g]gWeXe+h^g_gnh`gW X Y Z 0 1 * ohphqh.h/h:h+ , - . )b*b+b,b-b.b/b#h$h%h4e5e6e!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 7e8e9e' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb=b3b4g5g6g7g8grh{d9g;hic!g=h#g?hZb$g%g4b5bZe0eJgKgLgMb{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb|d}dxgygsh#fihMg$fth?bYe[f]f'ba b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@d^f_f|ctd1g+gKeQeAg2gBg3g)f) ]b1e}c'h(h)huhvhwhxhyhzhAhBhChDhEhFhGh%fFe*fGdAeGeudjcNc'fSe~cEe(fHhBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f2e3e3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c

261 self._memory_resource = None 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V /g:g;g=g?gmh,h-h@gVe[g]gWeXe+h^g_gnh`gW X Y Z 0 1 * ohphqh.h/h:h+ , - . )b*b+b,b-b.b/b#h$h%h4e5e6e!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 7e8e9e' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb=b3b4g5g6g7g8grh{d9g;hic!g=h#g?hZb$g%g4b5bZe0eJgKgLgMb{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb|d}dxgygsh#fihMg$fth?bYe[f]f'ba b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@d^f_f|ctd1g+gKeQeAg2gBg3g)f) ]b1e}c'h(h)huhvhwhxhyhzhAhBhChDhEhFhGh%fFe*fGdAeGeudjcNc'fSe~cEe(fHhBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f2e3e3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c

262 self._ipc_data = None 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V /g:g;g=g?gmh,h-h@gVe[g]gWeXe+h^g_gnh`gW X Y Z 0 1 * ohphqh.h/h:h+ , - . )b*b+b,b-b.b/b#h$h%h4e5e6e!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 7e8e9e' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb=b3b4g5g6g7g8grh{d9g;hic!g=h#g?hZb$g%g4b5bZe0eJgKgLgMb{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb|d}dxgygsh#fihMg$fth?bYe[f]f'ba b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@d^f_f|ctd1g+gKeQeAg2gBg3g)f) ]b1e}c'h(h)huhvhwhxhyhzhAhBhChDhEhFhGh%fFe*fGdAeGeudjcNc'fSe~cEe(fHhBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f2e3e3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c

263 self._owner = None 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V /g:g;g=g?gmh,h-h@gVe[g]gWeXe+h^g_gnh`gW X Y Z 0 1 * ohphqh.h/h:h+ , - . )b*b+b,b-b.b/b#h$h%h4e5e6e!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 7e8e9e' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb=b3b4g5g6g7g8grh{d9g;hic!g=h#g?hZb$g%g4b5bZe0eJgKgLgMb{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb|d}dxgygsh#fihMg$fth?bYe[f]f'ba b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@d^f_f|ctd1g+gKeQeAg2gBg3g)f) ]b1e}c'h(h)huhvhwhxhyhzhAhBhChDhEhFhGh%fFe*fGdAeGeudjcNc'fSe~cEe(fHhBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f2e3e3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c

264 self._mem_attrs_inited.store(False) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V /g:g;g=g?gmh,h-h@gVe[g]gWeXe+h^g_gnh`gW X Y Z 0 1 * ohphqh.h/h:h+ , - . )b*b+b,b-b.b/b#h$h%h4e5e6e!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 7e8e9e' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb=b3b4g5g6g7g8grh{d9g;hic!g=h#g?hZb$g%g4b5bZe0eJgKgLgMb{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb|d}dxgygsh#fihMg$fth?bYe[f]f'ba b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@d^f_f|ctd1g+gKeQeAg2gBg3g)f) ]b1e}c'h(h)huhvhwhxhyhzhAhBhChDhEhFhGh%fFe*fGdAeGeudjcNc'fSe~cEe(fHhBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f2e3e3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c

265  

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

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

268 "Please use MemoryResource APIs.") 

269  

270 @classmethod 

271 def _init( 

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

273 ipc_descriptor: IPCBufferDescriptor | None = None, 

274 owner : object | None = None, 

275 *, 

276 stream: Stream | GraphBuilder | None = None, 

277 ) -> Buffer: 

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

279  

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

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

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

283 When ``mr`` is provided, a deallocation stream is recorded at creation 

284 (``stream`` if given, otherwise ``default_stream()``). Recording a 

285 default-stream token requires a CUDA context to be current. 

286 """ 

287 if mr is not None and owner is not None: 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb4g5g6g7g8g{d9g!g#gZb$g%gMb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@dtd1g+gKeQeAg2gBg3gcjdj)f) ejFe*fGdAeGeud'fBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c

288 raise ValueError("owner and memory resource cannot be both specified together") 2ej

289 if stream is not None and mr is None: 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb4g5g6g7g8g{d9g!g#gZb$g%gMb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@dtd1g+gKeQeAg2gBg3gcjdj)f) Fe*fGdAeGeud'fBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c

290 raise ValueError("stream requires a memory resource (mr)") 2cjdj

291 cdef Buffer self = Buffer.__new__(cls) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb4g5g6g7g8g{d9g!g#gZb$g%gMb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@dtd1g+gKeQeAg2gBg3g)f) Fe*fGdAeGeud'fBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c

292 cdef uintptr_t c_ptr = <uintptr_t>(int(ptr)) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb4g5g6g7g8g{d9g!g#gZb$g%gMb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@dtd1g+gKeQeAg2gBg3g)f) Fe*fGdAeGeud'fBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c

293 cdef Stream s 

294 cdef cydriver.CUresult _ds_status 

295 if mr is not None: 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb4g5g6g7g8g{d9g!g#gZb$g%gMb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@dtd1g+gKeQeAg2gBg3g)f) Fe*fGdAeGeud'fBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c

296 s = Stream_accept(default_stream() if stream is None else stream) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb4g5g6g7g8g{d9g!g#gZb$g%gMb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p # $ ~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFd@dtd1g+gKeQeAg2gBg3g)f) Fe*fGdAeGeudBeHe:d[d]d;d=dd e f cfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/dRe

297 self._h_ptr = deviceptr_create_with_mr(c_ptr, size, mr) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb4g5g6g7g8g{d9g!g#gZb$g%gMb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p # $ ~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFd@dtd1g+gKeQeAg2gBg3g)f) Fe*fGdAeGeudBeHe:d[d]d;d=dd e f cfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/dRe

298 _ds_status = set_deallocation_stream(self._h_ptr, s._h_stream) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb4g5g6g7g8g{d9g!g#gZb$g%gMb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p # $ ~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFd@dtd1g+gKeQeAg2gBg3g)f) Fe*fGdAeGeudBeHe:d[d]d;d=dd e f cfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/dRe

299 if _ds_status != cydriver.CUresult.CUDA_SUCCESS: 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb4g5g6g7g8g{d9g!g#gZb$g%gMb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p # $ ~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFd@dtd1g+gKeQeAg2gBg3g)f) Fe*fGdAeGeudBeHe:d[d]d;d=dd e f cfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/dRe

300 # Reset before raising: the DevicePtrHandle destructor would otherwise 

301 # invoke _mr_dealloc_callback, which catches any inner exception and 

302 # clears the exception state, swallowing the error we're about to raise. 

303 self._h_ptr.reset() 21g+g

304 if _ds_status == cydriver.CUresult.CUDA_ERROR_INVALID_CONTEXT: 21g+g

305 raise RuntimeError( 21g+g

306 "Cannot record a default deallocation stream when no CUDA context is " 

307 "current. Call Device.set_current() first, or pass stream= with a " 

308 "non-default Stream." 

309 ) 

310 HANDLE_RETURN(_ds_status) 

311 else: 

312 self._h_ptr = deviceptr_create_with_owner(c_ptr, owner) 24g5g6g7g8g{d9g!g#gZb$g%gMbo p (bfcgc# $ NbObDd'fNg% ;c=c?c@c[c]c^c_c`c{c

313 self._size = size 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb4g5g6g7g8g{d9g!g#gZb$g%gMb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@dtdKeQeAg2gBg3g)f) Fe*fGdAeGeud'fBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c

314 self._memory_resource = mr 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb4g5g6g7g8g{d9g!g#gZb$g%gMb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@dtdKeQeAg2gBg3g)f) Fe*fGdAeGeud'fBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c

315 self._ipc_data = IPCDataForBuffer(ipc_descriptor, True) if ipc_descriptor is not None else None 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb4g5g6g7g8g{d9g!g#gZb$g%gMb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@dtdKeQeAg2gBg3g)f) Fe*fGdAeGeud'fBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c

316 self._owner = owner 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb4g5g6g7g8g{d9g!g#gZb$g%gMb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@dtdKeQeAg2gBg3g)f) Fe*fGdAeGeud'fBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c

317 self._mem_attrs_inited.store(False) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb4g5g6g7g8g{d9g!g#gZb$g%gMb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@dtdKeQeAg2gBg3g)f) Fe*fGdAeGeud'fBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c

318 return self 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb4g5g6g7g8g{d9g!g#gZb$g%gMb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@dtdKeQeAg2gBg3g)f) Fe*fGdAeGeud'fBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c

319  

320 @staticmethod 

321 def _reduce_helper(mr, ipc_descriptor): 

322 cdef ContextHandle h_ctx = get_current_context() 

323 cdef int device_id 

324 if not h_ctx: 

325 # Spawned processes unpickle arguments before entering their target, 

326 # so initialize the context needed to bind the default-stream token. 

327 device_id = mr.device_id 

328 (Device(device_id) if device_id >= 0 else Device()).set_current() 

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

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

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

332 # stream; the receiver can override it before or during close. 

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

334  

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

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

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

338 # Must not serialize the parent's stream! 

339 Buffer_check_open(self) 2{g|g}g~gahbhchdh^b_behfh+fghhh,f-f.f/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbFbGb

340 return Buffer._reduce_helper, (self.memory_resource, self.ipc_descriptor) 2{g|g}g~gahbhchdh^b_behfh+fghhh,f-f.f/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbFbGb

341  

342 @staticmethod 

343 def from_handle( 

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

345 owner: object | None = None, 

346 *, 

347 stream: Stream | GraphBuilder | None = None, 

348 ) -> Buffer: 

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

350  

351 Parameters 

352 ---------- 

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

354 Allocated buffer handle object 

355 size : int 

356 Memory size of the buffer 

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

358 Memory resource associated with the buffer. When provided, 

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

360 closed or garbage collected. 

361 owner : object, optional 

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

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

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

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

366 Keyword-only. The stream used to order the buffer's deallocation 

367 when ``mr`` owns the pointer. Defaults to ``default_stream()``. 

368 Recording a default-stream token requires a CUDA context to be 

369 current. If the buffer may be freed from a different host thread, 

370 pass a stream other than the per-thread default stream, which 

371 refers to a different stream on each thread. 

372  

373 Note 

374 ---- 

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

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

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

378 """ 

379 return Buffer._init(ptr, size, mr=mr, owner=owner, stream=stream) 2+ , - . )b*b+b,b-b.b/b' Ub6b5 6 ( 9 7bk l m ! 8b9b!b#bg VbHbh i j WbIb[b:bJbXbYbKbLb4g5g6g7g8g{d9g!g#gZb$g%gMb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb^d_d`dCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@dtd1gKeAgBgcj) ejFe*fGdAeGeud'fBe[d]d;d=dNg% ;c=c?c@c[c]c^c_c`c{c

380  

381 @classmethod 

382 def from_ipc_descriptor( 

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

384 *, stream: Stream 

385 ) -> Buffer: 

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

387  

388 Parameters 

389 ---------- 

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

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

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

393 The descriptor exported from another process. 

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

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

396 the buffer is closed or garbage collected. 

397  

398 Note 

399 ---- 

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

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

402 cooperating. 

403 """ 

404 return _ipc.Buffer_from_ipc_descriptor(cls, mr, ipc_descriptor, stream) 2FjGj%f(f

405  

406 @property 

407 @cython.critical_section 

408 def ipc_descriptor(self) -> IPCBufferDescriptor: 

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

410 Buffer_check_open(self) 2{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGbDd%fEe(f2e3e

411 cdef object ipc_data 

412 if self._ipc_data is None: 2{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb%fEe(f2e3e

413 ipc_data = IPCDataForBuffer(_ipc.Buffer_get_ipc_descriptor(self), False) 2{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb%fEe(f2e3e

414 if self._ipc_data is None: 2{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGbEe2e3e

415 self._ipc_data = ipc_data 2{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGbEe2e3e

416 return self._ipc_data.ipc_descriptor 2{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGbEe2e3e

417  

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

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

420  

421 This buffer is released back to their memory resource 

422 asynchronously on the given stream. 

423  

424 Parameters 

425 ---------- 

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

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

428 the deallocation stream stored in the handle is used. 

429  

430 See Also 

431 -------- 

432 set_deallocation_stream 

433 Change the deallocation stream without closing the buffer. 

434 """ 

435 Buffer_close(self, stream) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V /g:g;gmhVe]gWeXe^g_gnh`gW X Y Z 0 1 ohphqh+ , - . )b*b+b,b-b.b/b4e5e6e2 3 4 7e8e9e' OhUbPh6bQh5 6 7 Rhn Sh8 ThUhVh( Wh9 Xh7bYhk l m ! 8bZh9b0h!b1h#b2h3h4h5h6h7h8h9h!h1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb=b3b@h[h]h^h_hrh{d`hiiic{hji|hkiZb}h~h4b5bZe0eJgKgLgMbPbQbDbEbSbTbFbGbsh#fihMg$fth?bYe[f]f'bNeCesd)cbdmcEdIecdo p (b# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@d^f_f|ctdKeQe1e}cuhvhwhxhyhzhAhBhChDhEhFhGh%fFeGdAeGeudjcNc'fSe~cEe(fHhBeHe:d[d]d;d=d*h2e3epdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd

436  

437 def set_deallocation_stream(self, stream: Stream | GraphBuilder) -> None: 

438 """Change the stream that orders this buffer's eventual deallocation. 

439  

440 The buffer remains open and usable. A later :meth:`close` without a 

441 stream, garbage collection, or release of the final retained device 

442 pointer handle uses the replacement stream. 

443  

444 This method does not synchronize streams or establish dependencies. 

445 The caller must ensure that allocation and all accesses are ordered 

446 before the deallocation on ``stream``. 

447  

448 Parameters 

449 ---------- 

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

451 The stream to use for eventual asynchronous deallocation. 

452  

453 Raises 

454 ------ 

455 RuntimeError 

456 If the buffer is already closed, or if a default-stream token 

457 cannot be bound because no CUDA context is current. 

458 TypeError 

459 If ``stream`` is ``None`` or is not an accepted stream object. 

460  

461 Notes 

462 ----- 

463 Synchronizing concurrent mutation and destruction of the same buffer 

464 is the caller's responsibility. 

465 """ 

466 Buffer_set_deallocation_stream(self, stream) 2cdJe@dBe

467  

468 def __enter__(self): 

469 return self 2#fMg$f[f]f'b

470  

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

472 self.close() 2#fMg$f[f]f'b

473 return False 2#fMg$f[f]f'b

474  

475 def copy_to(self, dst: Buffer | None = None, *, stream: Stream | GraphBuilder, 

476 options: CopyOptions | None = None) -> Buffer: 

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

478  

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

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

481 allocated using the associated memory resource before the copy. 

482  

483 Parameters 

484 ---------- 

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

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

487 is allocated using this buffer's memory resource. 

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

489 Keyword argument specifying the stream for the 

490 asynchronous copy 

491 options : :class:`~utils.CopyOptions`, optional 

492 Transfer hints (source access order, location hints, overlap mode). 

493 Honored when cuda.bindings and the driver are both CUDA 13.2 or 

494 newer. Not accepted with ``LEGACY_DEFAULT_STREAM``; use 

495 ``PER_THREAD_DEFAULT_STREAM`` instead. Not accepted with a 

496 capturing stream either, since a graph cannot represent these 

497 attributes; use :meth:`graph.GraphNode.memcpy` for a plain, 

498 non-attributed copy node, or pass ``options=None``. On an older 

499 cuda.bindings/driver, ``src_access_order`` values of ``STREAM`` 

500 and ``ANY`` are silently ignored; ``DURING_API_CALL`` raises 

501 instead of silently downgrading its guarantee. 

502  

503 Raises 

504 ------ 

505 TypeError 

506 If ``options`` is not a :class:`~utils.CopyOptions` instance, or 

507 if ``options`` is given together with ``LEGACY_DEFAULT_STREAM`` 

508 or a stream currently in graph capture mode. 

509 RuntimeError 

510 If ``options.src_access_order`` is ``DURING_API_CALL`` and 

511 cuda.bindings or the driver is older than CUDA 13.2: falling 

512 back to a plain copy cannot honor that guarantee. 

513  

514 """ 

515 Buffer_check_open(self) 2;b7 n 8 k l m ccdcecg Hbh i $bj Ibhc:blcJbRbKbLba b c bdmcDd|c}c~cd e f

516 cdef Stream s = Stream_accept(stream) 2;b7 n 8 k l m ccdcecg Hbh i $bj Ibhc:blcJbRbKbLba b c bdmcDd|c}c~cd e f

517 cdef size_t src_size = self._size 2;b7 n 8 k l m ccdcecg Hbh i $bj Ibhc:blcJbRbKbLba b c bdmcDd|c}c~cd e f

518  

519 if dst is None: 2;b7 n 8 k l m ccdcecg Hbh i $bj Ibhc:blcJbRbKbLba b c bdmcDd|c}c~cd e f

520 if self._memory_resource is None: 1g

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

522 "buffer does not have a memory_resource)") 

523 dst = self._memory_resource.allocate(src_size, stream=s) 1g

524 else: 

525 Buffer_check_open(<Buffer>dst) 2;b7 n 8 k l m ccdcecg Hbh i $bj Ibhc:blcJbRbKbLba b c bdmcDd|c}c~cd e f

526  

527 cdef size_t dst_size = dst._size 2;b7 n 8 k l m ccdcecg Hbh i $bj Ibhc:blcJbRbKbLba b c bdmc|c}c~cd e f

528 if dst_size != src_size: 2;b7 n 8 k l m ccdcecg Hbh i $bj Ibhc:blcJbRbKbLba b c bdmc|c}c~cd e f

529 raise ValueError( "buffer sizes mismatch between src and dst (sizes " 2bd

530 f"are: src={src_size}, dst={dst_size})" 2bd

531 ) 

532 _dispatch_buffer_copy( 2;b7 n 8 k l m ccdcecg Hbh i $bj Ibhc:blcJbRbKbLba b c mc|c}c~cd e f

533 as_cu(dst._h_ptr), as_cu(self._h_ptr), src_size, s, options, "copy_to") 

534 return dst 2;b7 n 8 k l m g Hbh i $bj Ib:blcJbRbKbLba b c mc|c}c~cd e f

535  

536 def copy_from(self, src: Buffer, *, stream: Stream | GraphBuilder, 

537 options: CopyOptions | None = None) -> None: 

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

539  

540 Parameters 

541 ---------- 

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

543 Source buffer to copy data from 

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

545 Keyword argument specifying the stream for the 

546 asynchronous copy 

547 options : :class:`~utils.CopyOptions`, optional 

548 Transfer hints (source access order, location hints, overlap mode). 

549 Honored when cuda.bindings and the driver are both CUDA 13.2 or 

550 newer. Not accepted with ``LEGACY_DEFAULT_STREAM``; use 

551 ``PER_THREAD_DEFAULT_STREAM`` instead. Not accepted with a 

552 capturing stream either, since a graph cannot represent these 

553 attributes; use :meth:`graph.GraphNode.memcpy` for a plain, 

554 non-attributed copy node, or pass ``options=None``. On an older 

555 cuda.bindings/driver, ``src_access_order`` values of ``STREAM`` 

556 and ``ANY`` are silently ignored; ``DURING_API_CALL`` raises 

557 instead of silently downgrading its guarantee. 

558  

559 Raises 

560 ------ 

561 TypeError 

562 If ``options`` is not a :class:`~utils.CopyOptions` instance, or 

563 if ``options`` is given together with ``LEGACY_DEFAULT_STREAM`` 

564 or a stream currently in graph capture mode. 

565 RuntimeError 

566 If ``options.src_access_order`` is ``DURING_API_CALL`` and 

567 cuda.bindings or the driver is older than CUDA 13.2: falling 

568 back to a plain copy cannot honor that guarantee. 

569 """ 

570 Buffer_check_open(self) 2+ , - . )b*b+b,b-b.b/bbc' 6b5 6 ( 9 7b! 8b9b!b#bccdcecVb$bWbkc[bRbXbYb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb^d_d`dsd)cDd

571 Buffer_check_open(src) 2+ , - . )b*b+b,b-b.b/bbc' 6b5 6 ( 9 7b! 8b9b!b#bccdcecVb$bWbkc[bRbXbYb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb^d_d`dsd)cDd

572 cdef Stream s = Stream_accept(stream) 2+ , - . )b*b+b,b-b.b/bbc' 6b5 6 ( 9 7b! 8b9b!b#bccdcecVb$bWbkc[bRbXbYb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb^d_d`dsd)c

573 cdef size_t dst_size = self._size 2+ , - . )b*b+b,b-b.b/bbc' 6b5 6 ( 9 7b! 8b9b!b#bccdcecVb$bWbkc[bRbXbYb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb^d_d`dsd)c

574 cdef size_t src_size = src._size 2+ , - . )b*b+b,b-b.b/bbc' 6b5 6 ( 9 7b! 8b9b!b#bccdcecVb$bWbkc[bRbXbYb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb^d_d`dsd)c

575  

576 if src_size != dst_size: 2+ , - . )b*b+b,b-b.b/bbc' 6b5 6 ( 9 7b! 8b9b!b#bccdcecVb$bWbkc[bRbXbYb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb^d_d`dsd)c

577 raise ValueError( "buffer sizes mismatch between src and dst (sizes " 2sd

578 f"are: src={src_size}, dst={dst_size})" 2sd

579 ) 

580 _dispatch_buffer_copy( 2+ , - . )b*b+b,b-b.b/bbc' 6b5 6 ( 9 7b! 8b9b!b#bccdcecVb$bWbkc[bRbXbYb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb^d_d`d)c

581 as_cu(self._h_ptr), as_cu(src._h_ptr), dst_size, s, options, "copy_from") 

582  

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

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

585  

586 Parameters 

587 ---------- 

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

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

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

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

592 Stream for the asynchronous fill operation. 

593  

594 Raises 

595 ------ 

596 TypeError 

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

598 ValueError 

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

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

601 OverflowError 

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

603  

604 """ 

605 Buffer_check_open(self) 2=g?g@gVe[gWeXe+ , - . bc;b' Ubn ( k l m g h i j ~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeDd

606 cdef Stream s_stream = Stream_accept(stream) 2=g?g@gVe[gWeXe+ , - . bc;b' Ubn ( k l m g h i j ~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodze

607 cdef unsigned int val 

608 cdef unsigned int elem_size 

609 val, elem_size = _parse_fill_value(value) 2=g?g@gVe[gWeXe+ , - . bc;b' Ubn ( k l m g h i j ~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodze

610  

611 cdef size_t buffer_size = self._size 2=g?g@gVe[gWeXe+ , - . bc;b' Ubn ( k l m g h i j *cddPcedQc+cRc,c-c.cScTcUcVcWcXc/c:cYcZcfd0c1cgd2chdncidoc3cpc4c5c6cqcrcsctcucvc7c8cwcxcjdyczckd9cldAcmdBc!cCc#c$c%cDcEcFcGcHcIc'c(cJcKcndLcMcod

612 cdef cydriver.CUdeviceptr dst = as_cu(self._h_ptr) 2=g?g@gVe[gWeXe+ , - . bc;b' Ubn ( k l m g h i j *cddPcedQc+cRc,c-c.cScTcUcVcWcXc/c:cYcZcfd0c1cgd2chdncidoc3cpc4c5c6cqcrcsctcucvc7c8cwcxcjdyczckd9cldAcmdBc!cCc#c$c%cDcEcFcGcHcIc'c(cJcKcndLcMcod

613 cdef cydriver.CUstream s = as_cu(s_stream._h_stream) 2=g?g@gVe[gWeXe+ , - . bc;b' Ubn ( k l m g h i j *cddPcedQc+cRc,c-c.cScTcUcVcWcXc/c:cYcZcfd0c1cgd2chdncidoc3cpc4c5c6cqcrcsctcucvc7c8cwcxcjdyczckd9cldAcmdBc!cCc#c$c%cDcEcFcGcHcIc'c(cJcKcndLcMcod

614  

615 if elem_size == 1: 2=g?g@gVe[gWeXe+ , - . bc;b' Ubn ( k l m g h i j *cddPcedQc+cRc,c-c.cScTcUcVcWcXc/c:cYcZcfd0c1cgd2chdncidoc3cpc4c5c6cqcrcsctcucvc7c8cwcxcjdyczckd9cldAcmdBc!cCc#c$c%cDcEcFcGcHcIc'c(cJcKcndLcMcod

616 with nogil: 2=g?g@gVe[gWeXe+ , - . bc;b' Ubn ( k l m g h i j *c+c,c-c.c/c:c2c3c4c5c6c7c8c9c!c#c$c%c'c(c

617 HANDLE_RETURN(cydriver.cuMemsetD8Async(dst, val, buffer_size, s)) 2=g?g@gVe[gWeXe+ , - . bc;b' Ubn ( k l m g h i j *c+c,c-c.c/c:c2c3c4c5c6c7c8c9c!c#c$c%c'c(c

618 elif elem_size == 2: 

619 if buffer_size & 0x1: 2ddPcScTcUcYcZcfdhdncqcrcscwcxcjdldAcDcEcFcJcKcnd

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

621 with nogil: 2PcScTcUcYcZcncqcrcscwcxcAcDcEcFcJcKc

622 HANDLE_RETURN(cydriver.cuMemsetD16Async(dst, val, buffer_size // 2, s)) 2PcScTcUcYcZcncqcrcscwcxcAcDcEcFcJcKc

623 elif elem_size == 4: 

624 if buffer_size & 0x3: 2edQcRcVcWcXc0c1cgdidocpctcucvcyczckdmdBcCcGcHcIcLcMcod

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

626 with nogil: 2QcRcVcWcXc0c1cocpctcucvcyczcBcCcGcHcIcLcMc

627 HANDLE_RETURN(cydriver.cuMemsetD32Async(dst, val, buffer_size // 4, s)) 2QcRcVcWcXc0c1cocpctcucvcyczcBcCcGcHcIcLcMc

628  

629 def __dlpack__( 

630 self, 

631 *, 

632 stream: int | None = None, 

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

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

635 copy: bool | None = None, 

636 ) -> object: 

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

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

639 Buffer_check_open(self) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 a b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb?dOcDd) ]bd e f

640 if dl_device is not None: 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 a b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb?dOc) ]bd e f

641 raise BufferError("Sorry, not supported: dl_device other than None") 2Oc

642 if copy is True: 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 a b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb?dOc) ]bd e f

643 raise BufferError("Sorry, not supported: copy=True") 2Oc

644 if max_version is None: 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 a b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb?dOc) ]bd e f

645 versioned = False 2?dOc

646 else: 

647 if not isinstance(max_version, tuple) or len(max_version) != 2: 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 a b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbOc) ]bd e f

648 raise BufferError(f"Expected max_version tuple[int, int], got {max_version}") 2Oc

649 versioned = max_version >= (1, 0) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 a b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbOc) ]bd e f

650 return make_py_capsule(self, versioned) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 a b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb?dOc) ]bd e f

651  

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

653 Buffer_check_open(self) 2OeDePe0b%bDd) ]b

654 return classify_dl_device(self) 2OeDePe0b%b) ]b

655  

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

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

658 # This raises a BufferError unless: 

659 # 1. Python is 3.12+ 

660 # 2. This Buffer object is host accessible 

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

662  

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

664 # Supporting method paired with __buffer__. 

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

666  

667 @property 

668 def device_id(self) -> int: 

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

670 Buffer_check_open(self) 2#h$h%h|d}d?b'bDeOco p (bfcgc# $ NbObDd^f_f'h(h)hSe[d]d=d% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d@c[c]c^c_c`c{c

671 if self._memory_resource is not None: 2#h$h%h|d}d?b'bDeOco p (bfcgc# $ NbOb^f_f'h(h)hSe[d]d=d% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d@c[c]c^c_c`c{c

672 return self._memory_resource.device_id 2#h$h%h|d}dDeOc^f_f'h(h)hSe[d]d=dMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d

673 _init_memory_attrs(self) 2?b'bo p (bfcgc# $ NbOb% ;c=c?c@c[c]c^c_c`c{c

674 return self._mem_attrs.device_id 2?b'bo p (bfcgc# $ NbOb% ;c=c?c@c[c]c^c_c`c{c

675  

676 @property 

677 def handle(self) -> int: 

678 """Return the buffer handle object. 

679  

680 .. caution:: 

681  

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

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

684 """ 

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

686 # that expect a raw pointer value 

687 return as_intptr(self._h_ptr) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V /g:g;g=g?g@gVe[g]gWeXe+h^g_g`gW X Y Z 0 1 * + , - . )b*b+b,b-b.b/b#h$h%h!e#e`f{f$e|f%e'e}f~fagbgcgdgegfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvgwg2 3 4 ' Ub6b5 6 7 n 8 ( 9 7bk l m ! 8b9b!b#bg VbHbh i j WbIb[b:blcJbRbXbYbKbLb3bCg4gDg5gEg6gFg7g8g{d9gicGg!gHg#gZb$gIg%g4b5bMb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb|d}dxgyg#fih$f?bYe]f'ba b c ^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCe)cmccdJe?dOco p # $ 2cncoc3cpc4c5c6cqcrcsctcucvc7c8cwcxcyczc9cAcBc!cCc#c$c%cDcEcFcGcHcIc'c(cJcKcLcMcad|ctd)f) ]b}c'h(h)hFe*fGeud~cHe;d=dd e f *hoiNgpdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d@cRe[c]c^c_c`c{c

688  

689 @property 

690 def is_closed(self) -> bool: 

691 """Whether this buffer has been closed.""" 

692 return self._h_ptr.get() == NULL 23bCgDgEgFg,gicGgHg-g.gIg4b5b@d;d=d*h

693  

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

695 if not isinstance(other, Buffer): 2#e$e%e'eoiNghjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjfjpiqi

696 return NotImplemented 2oihjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEj

697 cdef Buffer other_buf = <Buffer>other 2#e$e%e'eoiNgfjpiqi

698 return (as_intptr(self._h_ptr) == as_intptr(other_buf._h_ptr) and 2#e$e%e'eoiNgfjpiqi

699 self._size == other_buf._size) 2oiNgpiqi

700  

701 def __hash__(self) -> int: 

702 return hash((as_intptr(self._h_ptr), self._size)) 2NgHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj0j1j2j3j4j5j6j7j8jpiqi

703  

704 def __repr__(self) -> str: 

705 maybe_is_mapped = " is_mapped=True" if self.is_mapped else "" 2!e(e^b_b'g(g+f,f-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@f*hgj

706 return f"<Buffer ptr={as_intptr(self._h_ptr):#x} size={self._size}{maybe_is_mapped}>" 2!e(e^b_b'g(g+f,f-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@f*hgj

707  

708 @property 

709 def is_device_accessible(self) -> bool: 

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

711 Buffer_check_open(self) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 ?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb?dOeDePe0b%bOco p (bfcgc# $ NbObadDd) ]b1eSeEed e f % ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d@c[c]c^c_c`c{c

712 if self._memory_resource is not None: 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 ?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb?dOeDePe0b%bOco p (bfcgc# $ NbObad) ]b1eSeEed e f % ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d@c[c]c^c_c`c{c

713 return self._memory_resource.is_device_accessible 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 a b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb?dOeDePe0b%bOcad) ]b1eSeEed e f MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d

714 _init_memory_attrs(self) 2?b'bo p (bfcgc# $ NbOb% ;c=c?c@c[c]c^c_c`c{c

715 return self._mem_attrs.is_device_accessible 2?b'bo p (bfcgc# $ NbOb% ;c=c?c@c[c]c^c_c`c{c

716  

717 @property 

718 def is_host_accessible(self) -> bool: 

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

720 Buffer_check_open(self) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 a b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb?dOeDePe0b%bOco p (bfcgc# $ NbOb*cPcQc+cRc,c-c.cScTcUcVcWcXc/c:cYcZc0c1c2cncoc3cpc4c5c6cqcrcsctcucvc7c8cwcxcyczc9cAcBc!cCc#c$c%cDcEcFcGcHcIc'c(cJcKcLcMcadDd) ]b1eSeEed e f %

721 if self._memory_resource is not None: 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 a b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb?dOeDePe0b%bOco p (bfcgc# $ NbOb*cPcQc+cRc,c-c.cScTcUcVcWcXc/c:cYcZc0c1c2cncoc3cpc4c5c6cqcrcsctcucvc7c8cwcxcyczc9cAcBc!cCc#c$c%cDcEcFcGcHcIc'c(cJcKcLcMcad) ]b1eSeEed e f %

722 return self._memory_resource.is_host_accessible 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 a b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb?dOeDePe0b%bOc*cPcQc+cRc,c-c.cScTcUcVcWcXc/c:cYcZc0c1c2cncoc3cpc4c5c6cqcrcsctcucvc7c8cwcxcyczc9cAcBc!cCc#c$c%cDcEcFcGcHcIc'c(cJcKcLcMcad) ]b1eSeEed e f

723 _init_memory_attrs(self) 2o p (bfcgc# $ NbOb%

724 return self._mem_attrs.is_host_accessible 2o p (bfcgc# $ NbOb%

725  

726 @property 

727 def is_managed(self) -> bool: 

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

729 Buffer_check_open(self) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bDd) ]bjcNcd e f

730 _init_memory_attrs(self) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%b) ]bjcNcd e f

731 if self._mem_attrs.is_managed: 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%b) ]bjcNcd e f

732 return True 2=b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5b%b) ]b

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

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

735 return self._memory_resource is not None and self._memory_resource.is_managed 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 Mba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0bjcNcd e f

736  

737 @property 

738 def is_mapped(self) -> bool: 

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

740 return getattr(self._ipc_data, "is_mapped", False) 2!e(e^b_b'g(g+f,f-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fad*hgj

741  

742  

743 @property 

744 def memory_resource(self) -> MemoryResource: 

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

746 return self._memory_resource 2+ , - . )b*b+b,b-b.b/b' 6b5 6 ( 9 7b! 8b9b!b#b{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb?b'bCead|c1e}c%fSe~cEe(f[d]d2e3e;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLe+d,dMe-d.d/d@c[c]c^c_c`c{c

747  

748 @property 

749 def size(self) -> int: 

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

751 return self._size 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b#h$h%h2 3 4 ' Ub6b5 6 7 n 8 ( 9 ci7bk l m ! 8b9b!b#bdieifi1b2bg VbHbh i j WbIb[b:blcJbRbXbYbKbLb3bCg4gDg5gEg6gFg7g8g{d9gicGg!gHg#gZb$gIg%g4b5bMb{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb|d}d#f$f?bYe[fa b c ^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbcdJe?dOcad^f_f|c)f) ]b1e}c'h(h)hSe~cEeHe[d]d;d=dd e f Ng2e3epdvdwdxdydzdAdBdCdqdrdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLe+d,dMe-d.d/d

752  

753 @property 

754 def owner(self) -> object: 

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

756 return self._owner 

757  

758  

759cdef class MemoryResource: 

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

761 deallocation of buffers. 

762  

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

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

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

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

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

768 resource's respective property.) 

769 """ 

770  

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

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

773  

774 Parameters 

775 ---------- 

776 size : int 

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

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

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

780 asynchronously. Must be passed explicitly; pass 

781 ``device.default_stream`` to use the default stream. For subclasses 

782 that support stream-ordered deallocation, this stream also orders 

783 the buffer's eventual deallocation, so if the buffer may be freed 

784 from a different host thread, prefer a stream other than the 

785 per-thread default stream, which refers to a different stream on 

786 each thread. 

787  

788 Returns 

789 ------- 

790 Buffer 

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

792 depending on the resource's properties. 

793 """ 

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

795  

796 def deallocate( 

797 self, 

798 ptr: DevicePointerType, 

799 size_t size, 

800 *, 

801 stream: Stream | GraphBuilder 

802 ) -> None: 

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

804  

805 Parameters 

806 ---------- 

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

808 The pointer or handle to the buffer to deallocate. 

809 size : int 

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

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

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

813 asynchronously. Must be passed explicitly; pass 

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

815 """ 

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

817  

818 @property 

819 def is_device_accessible(self) -> bool: 

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

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

822  

823 @property 

824 def is_host_accessible(self) -> bool: 

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

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

827  

828 @property 

829 def is_managed(self) -> bool: 

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

831 return False 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 a b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0bjcNcd e f

832  

833 @property 

834 def device_id(self) -> int: 

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

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

837  

838  

839# Buffer Implementation Helpers 

840# ----------------------------- 

841cdef Buffer Buffer_from_deviceptr_handle( 

842 DevicePtrHandle h_ptr, 

843 size_t size, 

844 MemoryResource mr, 

845 object ipc_descriptor = None, 

846 type cls = Buffer, 

847): 

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

849 cdef Buffer buf = cls.__new__(cls) 2/g:g;g=g?gmh,h-h@gVe[g]gWeXe+h^g_gnh`gohphqh.h/h:h+ , - . )b*b+b,b-b.b/b#h$h%h4e5e6ebc;b7e8e9e)e*e+e5 6 7 ,en -e8 .e/e:e;e9 =e?ek l m ! @e[e]e^e_e`e{e|e}e~eafbf1b2bg h i j =b3brh;hic=h?h4b5bZe0eJgKgLg{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb|d}dsh#fihMg$fth?bYe[f]f'ba b c o p ^f_f|c]b1e}c'h(h)huhvhwhxhyhzhAhBhChDhEhFhGh%fjcNcSe~cEe(fHhd e f cfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f2e3e3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/dRe

850 buf._h_ptr = h_ptr 2/g:g;g=g?gmh,h-h@gVe[g]gWeXe+h^g_gnh`gohphqh.h/h:h+ , - . )b*b+b,b-b.b/b#h$h%h4e5e6ebc;b7e8e9e)e*e+e5 6 7 ,en -e8 .e/e:e;e9 =e?ek l m ! @e[e]e^e_e`e{e|e}e~eafbf1b2bg h i j =b3brh;hic=h?h4b5bZe0eJgKgLg{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb|d}dsh#fihMg$fth?bYe[f]f'ba b c o p ^f_f|c]b1e}c'h(h)huhvhwhxhyhzhAhBhChDhEhFhGh%fjcNcSe~cEe(fHhd e f cfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f2e3e3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/dRe

851 buf._size = size 2/g:g;g=g?gmh,h-h@gVe[g]gWeXe+h^g_gnh`gohphqh.h/h:h+ , - . )b*b+b,b-b.b/b#h$h%h4e5e6ebc;b7e8e9e)e*e+e5 6 7 ,en -e8 .e/e:e;e9 =e?ek l m ! @e[e]e^e_e`e{e|e}e~eafbf1b2bg h i j =b3brh;hic=h?h4b5bZe0eJgKgLg{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb|d}dsh#fihMg$fth?bYe[f]f'ba b c o p ^f_f|c]b1e}c'h(h)huhvhwhxhyhzhAhBhChDhEhFhGh%fjcNcSe~cEe(fHhd e f cfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f2e3e3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/dRe

852 buf._memory_resource = mr 2/g:g;g=g?gmh,h-h@gVe[g]gWeXe+h^g_gnh`gohphqh.h/h:h+ , - . )b*b+b,b-b.b/b#h$h%h4e5e6ebc;b7e8e9e)e*e+e5 6 7 ,en -e8 .e/e:e;e9 =e?ek l m ! @e[e]e^e_e`e{e|e}e~eafbf1b2bg h i j =b3brh;hic=h?h4b5bZe0eJgKgLg{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb|d}dsh#fihMg$fth?bYe[f]f'ba b c o p ^f_f|c]b1e}c'h(h)huhvhwhxhyhzhAhBhChDhEhFhGh%fjcNcSe~cEe(fHhd e f cfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f2e3e3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/dRe

853 buf._ipc_data = IPCDataForBuffer(ipc_descriptor, True) if ipc_descriptor is not None else None 2/g:g;g=g?gmh,h-h@gVe[g]gWeXe+h^g_gnh`gohphqh.h/h:h+ , - . )b*b+b,b-b.b/b#h$h%h4e5e6ebc;b7e8e9e)e*e+e5 6 7 ,en -e8 .e/e:e;e9 =e?ek l m ! @e[e]e^e_e`e{e|e}e~eafbf1b2bg h i j =b3brh;hic=h?h4b5bZe0eJgKgLg{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb|d}dsh#fihMg$fth?bYe[f]f'ba b c o p ^f_f|c]b1e}c'h(h)huhvhwhxhyhzhAhBhChDhEhFhGh%fjcNcSe~cEe(fHhd e f cfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f2e3e3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/dRe

854 buf._owner = None 2/g:g;g=g?gmh,h-h@gVe[g]gWeXe+h^g_gnh`gohphqh.h/h:h+ , - . )b*b+b,b-b.b/b#h$h%h4e5e6ebc;b7e8e9e)e*e+e5 6 7 ,en -e8 .e/e:e;e9 =e?ek l m ! @e[e]e^e_e`e{e|e}e~eafbf1b2bg h i j =b3brh;hic=h?h4b5bZe0eJgKgLg{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb|d}dsh#fihMg$fth?bYe[f]f'ba b c o p ^f_f|c]b1e}c'h(h)huhvhwhxhyhzhAhBhChDhEhFhGh%fjcNcSe~cEe(fHhd e f cfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f2e3e3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/dRe

855 buf._mem_attrs_inited.store(False) 2/g:g;g=g?gmh,h-h@gVe[g]gWeXe+h^g_gnh`gohphqh.h/h:h+ , - . )b*b+b,b-b.b/b#h$h%h4e5e6ebc;b7e8e9e)e*e+e5 6 7 ,en -e8 .e/e:e;e9 =e?ek l m ! @e[e]e^e_e`e{e|e}e~eafbf1b2bg h i j =b3brh;hic=h?h4b5bZe0eJgKgLg{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb|d}dsh#fihMg$fth?bYe[f]f'ba b c o p ^f_f|c]b1e}c'h(h)huhvhwhxhyhzhAhBhChDhEhFhGh%fjcNcSe~cEe(fHhd e f cfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f2e3e3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/dRe

856 return buf 2/g:g;g=g?gmh,h-h@gVe[g]gWeXe+h^g_gnh`gohphqh.h/h:h+ , - . )b*b+b,b-b.b/b#h$h%h4e5e6ebc;b7e8e9e)e*e+e5 6 7 ,en -e8 .e/e:e;e9 =e?ek l m ! @e[e]e^e_e`e{e|e}e~eafbf1b2bg h i j =b3brh;hic=h?h4b5bZe0eJgKgLg{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb|d}dsh#fihMg$fth?bYe[f]f'ba b c o p ^f_f|c]b1e}c'h(h)huhvhwhxhyhzhAhBhChDhEhFhGh%fjcNcSe~cEe(fHhd e f cfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f2e3e3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/dRe

857  

858  

859cdef tuple Buffer_coerce_batch(object buffers, str what, str single_hint): 

860 """Coerce ``buffers`` to a ``tuple[Buffer, ...]``; reject a bare Buffer. 

861  

862 Shared by the batched free functions. Passing one Buffer is rejected 

863 rather than treated as a one-element batch so that the per-buffer API 

864 named by ``single_hint`` stays the single obvious way to do it. 

865 """ 

866 cdef list out 

867 if isinstance(buffers, Buffer): 2' Ub6b5 6 7 n 8 limi( 9 ci7bk l m ! 8b9b!b#bnidieifigihiaibi1b2b=b3b4b5bZe0eJgKgLg

868 raise TypeError( 2biJgKgLg

869 f"{what}: pass a sequence of Buffers; for a single buffer use {single_hint}" 2biJgKgLg

870 ) 

871 if not isinstance(buffers, Sequence): 2' Ub6b5 6 7 n 8 limi( 9 ci7bk l m ! 8b9b!b#bnidieifigihiaibi1b2b=b3b4b5bZe0e

872 raise TypeError( 2ai

873 f"{what}: buffers must be a sequence of Buffer, got {type(buffers).__name__}" 2ai

874 ) 

875 if not buffers: 2' Ub6b5 6 7 n 8 limi( 9 ci7bk l m ! 8b9b!b#bnidieifigihiaibi1b2b=b3b4b5bZe0e

876 raise ValueError(f"{what}: empty buffers sequence") 2gi

877 out = [] 2' Ub6b5 6 7 n 8 limi( 9 ci7bk l m ! 8b9b!b#bnidieifigihiaibi1b2b=b3b4b5bZe0e

878 for item in buffers: 2' Ub6b5 6 7 n 8 limi( 9 ci7bk l m ! 8b9b!b#bnidieifigihiaibi1b2b=b3b4b5bZe0e

879 if not isinstance(item, Buffer): 2' Ub6b5 6 7 n 8 limi( 9 ci7bk l m ! 8b9b!b#bnidieifigihiaibi1b2b=b3b4b5bZe0e

880 raise TypeError(f"{what}: expected Buffer, got {type(item).__name__}") 2hi

881 Buffer_check_open(<Buffer>item) 2' Ub6b5 6 7 n 8 limi( 9 ci7bk l m ! 8b9b!b#bnidieifigihiaibi1b2b=b3b4b5bZe0e

882 out.append(item) 2' Ub6b5 6 7 n 8 limi( 9 ci7bk l m ! 8b9b!b#bnidieifigihiaibi1b2b=b3b4b5bZe0e

883 return tuple(out) 2' Ub6b5 6 7 n 8 limi( 9 ci7bk l m ! 8b9b!b#bnidieifigihiaibi1b2b=b3b4b5bZe0e

884  

885cdef inline void Buffer_set_deallocation_stream(Buffer self, object stream): 

886 """Validate and replace a live buffer's deallocation recipe.""" 

887 Buffer_check_open(self) 24e5e6e7e8e9eOhUbPhQh5 6 7 Rhn Sh8 ThUhVhWh9 XhYhk l m ! Zh0h1h2h3h4h5h6h7h8h9h!h1b2bg VbHbh i j WbIb[b:bJbXbYbKbLbYeEdcdJeFd@d|ctd}cGdud~cBe:d

888 cdef Stream s = Stream_accept(stream) 24e5e6e7e8e9eOhUbPhQh5 6 7 Rhn Sh8 ThUhVhWh9 XhYhk l m ! Zh0h1h2h3h4h5h6h7h8h9h!h1b2bg VbHbh i j WbIb[b:bJbXbYbKbLbYeEdcdJeFd@d|ctd}cGdud~cBe:d

889 _apply_deallocation_stream(self._h_ptr, s._h_stream) 24e5e6e7e8e9eOhUbPhQh5 6 7 Rhn Sh8 ThUhVhWh9 XhYhk l m ! Zh0h1h2h3h4h5h6h7h8h9h!h1b2bg VbHbh i j WbIb[b:bJbXbYbKbLbYeEdcdJeFd|ctd}cGdud~c:d

890  

891  

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

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

894 if not self._h_ptr: 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V /g:g;gmhVe]gWeXe^g_gnh`gW X Y Z 0 1 ohphqh+ , - . )b*b+b,b-b.b/b4e5e6e2 3 4 7e8e9e' OhUbPh6bQh5 6 7 Rhn Sh8 ThUhVh( Wh9 Xh7bYhk l m ! 8bZh9b0h!b1h#b2h3h4h5h6h7h8h9h!h1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb=b3b@h[h]h^h_hrh{d`hiiic{hji|hkiZb}h~h4b5bZe0eJgKgLgMbPbQbDbEbSbTbFbGbsh#fihMg$fth?bYe[f]f'bNeCesd)cbdmcEdIecdo p (b# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@d^f_f|ctdKeQe1e}cuhvhwhxhyhzhAhBhChDhEhFhGh%fFeGdAeGeudjcNc'fSe~cEe(fHhBeHe:d[d]d;d=d*h2e3epdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd

895 return 2*h

896 # Update deallocation stream if provided 

897 if stream is not None: 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V /g:g;gmhVe]gWeXe^g_gnh`gW X Y Z 0 1 ohphqh+ , - . )b*b+b,b-b.b/b4e5e6e2 3 4 7e8e9e' OhUbPh6bQh5 6 7 Rhn Sh8 ThUhVh( Wh9 Xh7bYhk l m ! 8bZh9b0h!b1h#b2h3h4h5h6h7h8h9h!h1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb=b3b@h[h]h^h_hrh{d`hiiic{hji|hkiZb}h~h4b5bZe0eJgKgLgMbPbQbDbEbSbTbFbGbsh#fihMg$fth?bYe[f]f'bNeCesd)cbdmcEdIecdo p (b# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@d^f_f|ctdKeQe1e}cuhvhwhxhyhzhAhBhChDhEhFhGh%fFeGdAeGeudjcNc'fSe~cEe(fHhBeHe:d[d]d;d=d*h2e3epdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd

898 Buffer_set_deallocation_stream(self, stream) 24e5e6e7e8e9eOhUbPhQh5 6 7 Rhn Sh8 ThUhVhWh9 XhYhk l m ! Zh0h1h2h3h4h5h6h7h8h9h!h1b2bg VbHbh i j WbIb[b:bJbXbYbKbLbYeEdFd@d|ctd}cGdud~c:d

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

900 self._h_ptr.reset() 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V /g:g;gmhVe]gWeXe^g_gnh`gW X Y Z 0 1 ohphqh+ , - . )b*b+b,b-b.b/b4e5e6e2 3 4 7e8e9e' OhUbPh6bQh5 6 7 Rhn Sh8 ThUhVh( Wh9 Xh7bYhk l m ! 8bZh9b0h!b1h#b2h3h4h5h6h7h8h9h!h1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb=b3b@h[h]h^h_hrh{d`hiiic{hji|hkiZb}h~h4b5bZe0eJgKgLgMbPbQbDbEbSbTbFbGbsh#fihMg$fth?bYe[f]f'bNeCesd)cbdmcEdIecdo p (b# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@d^f_f|ctdKeQe1e}cuhvhwhxhyhzhAhBhChDhEhFhGh%fFeGdAeGeudjcNc'fSe~cEe(fHhBeHe:d[d]d;d=d*h2e3epdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd

901 self._size = 0 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V /g:g;gmhVe]gWeXe^g_gnh`gW X Y Z 0 1 ohphqh+ , - . )b*b+b,b-b.b/b4e5e6e2 3 4 7e8e9e' OhUbPh6bQh5 6 7 Rhn Sh8 ThUhVh( Wh9 Xh7bYhk l m ! 8bZh9b0h!b1h#b2h3h4h5h6h7h8h9h!h1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb=b3b@h[h]h^h_hrh{d`hiiic{hji|hkiZb}h~h4b5bZe0eJgKgLgMbPbQbDbEbSbTbFbGbsh#fihMg$fth?bYe[f]f'bNeCesd)cbdmcEdIecdo p (b# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@d^f_f|ctdKeQe1e}cuhvhwhxhyhzhAhBhChDhEhFhGh%fFeGdAeGeudjcNc'fSe~cEe(fHhBeHe:d[d]d;d=d*h2e3epdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd

902 self._memory_resource = None 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V /g:g;gmhVe]gWeXe^g_gnh`gW X Y Z 0 1 ohphqh+ , - . )b*b+b,b-b.b/b4e5e6e2 3 4 7e8e9e' OhUbPh6bQh5 6 7 Rhn Sh8 ThUhVh( Wh9 Xh7bYhk l m ! 8bZh9b0h!b1h#b2h3h4h5h6h7h8h9h!h1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb=b3b@h[h]h^h_hrh{d`hiiic{hji|hkiZb}h~h4b5bZe0eJgKgLgMbPbQbDbEbSbTbFbGbsh#fihMg$fth?bYe[f]f'bNeCesd)cbdmcEdIecdo p (b# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@d^f_f|ctdKeQe1e}cuhvhwhxhyhzhAhBhChDhEhFhGh%fFeGdAeGeudjcNc'fSe~cEe(fHhBeHe:d[d]d;d=d*h2e3epdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd

903 self._ipc_data = None 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V /g:g;gmhVe]gWeXe^g_gnh`gW X Y Z 0 1 ohphqh+ , - . )b*b+b,b-b.b/b4e5e6e2 3 4 7e8e9e' OhUbPh6bQh5 6 7 Rhn Sh8 ThUhVh( Wh9 Xh7bYhk l m ! 8bZh9b0h!b1h#b2h3h4h5h6h7h8h9h!h1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb=b3b@h[h]h^h_hrh{d`hiiic{hji|hkiZb}h~h4b5bZe0eJgKgLgMbPbQbDbEbSbTbFbGbsh#fihMg$fth?bYe[f]f'bNeCesd)cbdmcEdIecdo p (b# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@d^f_f|ctdKeQe1e}cuhvhwhxhyhzhAhBhChDhEhFhGh%fFeGdAeGeudjcNc'fSe~cEe(fHhBeHe:d[d]d;d=d*h2e3epdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd

904 self._owner = None 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V /g:g;gmhVe]gWeXe^g_gnh`gW X Y Z 0 1 ohphqh+ , - . )b*b+b,b-b.b/b4e5e6e2 3 4 7e8e9e' OhUbPh6bQh5 6 7 Rhn Sh8 ThUhVh( Wh9 Xh7bYhk l m ! 8bZh9b0h!b1h#b2h3h4h5h6h7h8h9h!h1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb=b3b@h[h]h^h_hrh{d`hiiic{hji|hkiZb}h~h4b5bZe0eJgKgLgMbPbQbDbEbSbTbFbGbsh#fihMg$fth?bYe[f]f'bNeCesd)cbdmcEdIecdo p (b# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@d^f_f|ctdKeQe1e}cuhvhwhxhyhzhAhBhChDhEhFhGh%fFeGdAeGeudjcNc'fSe~cEe(fHhBeHe:d[d]d;d=d*h2e3epdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd

905 self._mem_attrs_inited.store(False) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V /g:g;gmhVe]gWeXe^g_gnh`gW X Y Z 0 1 ohphqh+ , - . )b*b+b,b-b.b/b4e5e6e2 3 4 7e8e9e' OhUbPh6bQh5 6 7 Rhn Sh8 ThUhVh( Wh9 Xh7bYhk l m ! 8bZh9b0h!b1h#b2h3h4h5h6h7h8h9h!h1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb=b3b@h[h]h^h_hrh{d`hiiic{hji|hkiZb}h~h4b5bZe0eJgKgLgMbPbQbDbEbSbTbFbGbsh#fihMg$fth?bYe[f]f'bNeCesd)cbdmcEdIecdo p (b# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@d^f_f|ctdKeQe1e}cuhvhwhxhyhzhAhBhChDhEhFhGh%fFeGdAeGeudjcNc'fSe~cEe(fHhBeHe:d[d]d;d=d*h2e3epdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd