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

306 statements  

« prev     ^ index     » next       coverage.py v7.16.0, created at 2026-09-10 02:27 +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 Si9eW X Y Z 0 1 - . / : ; [b]b^b_b`b{b|b=e?eagbg@ecg[e]edgegfgggMgNgOgPgQghgigjgRgSgTgUgVgWgXgkglgmgngogpgqgrgsgtgugvgwgxgygzg^eocdcAgoeYgBg2 3 4 ) $h9b%h-b'h7 8 9 (hn )h! *h+h,h* -h# .h.b/hk l m $ /b:h:b;h;b=h=b?h@h[h]h^h_h`h{h|h+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1bpiqirisitipeuiviwi'bxiyi2bTi+ UiViWiXiYiZi0i1i2i3i4iTbUb6b7bVbWbqereCgDga b c !elemene5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbseheJd`crdzcUd3eEgsd4ete(eXe)e*b@b2co p % ' ueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdieKdYeZeahfh5e#eFgZgGg0g}f, 0e~fWdVe1eLdWe2edejekeeefed e f fi5i6i7i8i9i!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~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded( 3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebece$e8b

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 Si9eW X Y Z 0 1 - . / : ; [b]b^b_b`b{b|b=e?eagbg@ecg[e]edgegfgggMgNgOgPgQghgigjgRgSgTgUgVgWgXgkglgmgngogpgqgrgsgtgugvgwgxgygzg^eocdcAgoeYgBg2 3 4 ) $h9b%h-b'h7 8 9 (hn )h! *h+h,h* -h# .h.b/hk l m $ /b:h:b;h;b=h=b?h@h[h]h^h_h`h{h|h+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1bpiqirisitipeuiviwi'bxiyi2bTi+ UiViWiXiYiZi0i1i2i3i4iTbUb6b7bVbWbqereCgDga b c !elemene5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbseheJd`crdzcUd3eEgsd4ete(eXe)e*b@b2co p % ' ueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdieKdYeZeahfh5e#eFgZgGg0g}f, 0e~fWdVe1eLdWe2edejekeeefed e f fi5i6i7i8i9i!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~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded( 3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebece$e8b

66 # No stream was recorded: host-only memory (Buffer._init records 

67 # none) or a Buffer released before one was set. The default-stream 

68 # token needs no CUDA context to construct. 

69 stream = default_stream() 2sete(e)egdYeZeahfh

70 else: 

71 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 Si9eW X Y Z 0 1 - . / : ; [b]b^b_b`b{b|b=e?eagbg@ecg[e]edgegfgggMgNgOgPgQghgigjgRgSgTgUgVgWgXgkglgmgngogpgqgrgsgtgugvgwgxgygzg^eocdcAgoeYgBg2 3 4 ) $h9b%h-b'h7 8 9 (hn )h! *h+h,h* -h# .h.b/hk l m $ /b:h:b;h;b=h=b?h@h[h]h^h_h`h{h|h+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1bpiqirisitipeuiviwi'bxiyi2bTi+ UiViWiXiYiZi0i1i2i3i4iTbUb6b7bVbWbqereCgDga b c !elemene5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbseheJd`crdzcUd3eEgsd4eXe*b@b2co p % ' ueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdieKd5e#eFgZgGg0g}f, 0e~fWdVe1eLdWe2edejekeeefed e f fi5i6i7i8i9i!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~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded( 3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebece$e8b

72 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 Si9eW X Y Z 0 1 - . / : ; [b]b^b_b`b{b|b=e?eagbg@ecg[e]edgegfgggMgNgOgPgQghgigjgRgSgTgUgVgWgXgkglgmgngogpgqgrgsgtgugvgwgxgygzg^eocdcAgoeYgBg2 3 4 ) $h9b%h-b'h7 8 9 (hn )h! *h+h,h* -h# .h.b/hk l m $ /b:h:b;h;b=h=b?h@h[h]h^h_h`h{h|h+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1bpiqirisitipeuiviwi'bxiyi2bTi+ UiViWiXiYiZi0i1i2i3i4iTbUb6b7bVbWbqereCgDga b c !elemene5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbseheJd`crdzcUd3eEgsd4ete(eXe)e*b@b2co p % ' ueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdieKdYeZeahfh5e#eFgZgGg0g}f, 0e~fWdVe1eLdWe2edejekeeefed e f fi5i6i7i8i9i!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~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded( 3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebece$e8b

73 except Exception as exc: 2Veee

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

75 file=sys.stderr) 2Veee

76  

77register_mr_dealloc_callback(_mr_dealloc_callback) 

78  

79  

80cdef inline void _apply_deallocation_stream( 

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

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

83  

84 Translates CUDA_ERROR_INVALID_CONTEXT (default-stream token with no current 

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

86 """ 

87 cdef cydriver.CUresult status = set_deallocation_stream(h_ptr, h_stream) 2]f^f_f`f{f|f$h9b%h'h7 8 9 (hn )h! *h+h,h-h# .h/hk l m $ :h;h=h?h@h[h]h^h_h`h{h|h+b,bg !bXbh i j #bYbfc}bZb$b%b0b1b/eUdsd4eVdGdKdHdWdLdIdde

88 if status == cydriver.CUresult.CUDA_ERROR_INVALID_CONTEXT: 2]f^f_f`f{f|f$h9b%h'h7 8 9 (hn )h! *h+h,h-h# .h/hk l m $ :h;h=h?h@h[h]h^h_h`h{h|h+b,bg !bXbh i j #bYbfc}bZb$b%b0b1b/eUdsd4eVdGdKdHdWdLdIdde

89 raise RuntimeError( 2Vd

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

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

92 "non-default Stream." 

93 ) 

94 HANDLE_RETURN(status) 2]f^f_f`f{f|f$h9b%h'h7 8 9 (hn )h! *h+h,h-h# .h/hk l m $ :h;h=h?h@h[h]h^h_h`h{h|h+b,bg !bXbh i j #bYbfc}bZb$b%b0b1b/eUdsd4eGdKdHdWdLdIdde

95  

96  

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

98  

99  

100# Memory Attribute Query Helpers 

101# ------------------------------ 

102cdef inline int _query_memory_attrs( 

103 _MemAttrs& out, 

104 cydriver.CUdeviceptr ptr 

105) except -1 nogil: 

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

107 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 pc~b=g?g@g[gghHhIh^c]g^ghhih'bJh_gacbc2bqceca b c 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSb*b@bo p cc0c1c% ' (b)b, uc_cfdd e f ( hdidjdkdldmdndodpdqd

108 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 pc~b=g?g@g[gghHhIh^c]g^ghhih'bJh_gacbc2bqceca b c 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSb*b@bo p cc0c1c% ' (b)b, uc_cfdd e f ( hdidjdkdldmdndodpdqd

109 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 pc~b=g?g@g[gghHhIh^c]g^ghhih'bJh_gacbc2bqceca b c 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSb*b@bo p cc0c1c% ' (b)b, uc_cfdd e f ( hdidjdkdldmdndodpdqd

110 cdef cydriver.CUpointer_attribute[3] attrs = [ 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 pc~b=g?g@g[gghHhIh^c]g^ghhih'bJh_gacbc2bqceca b c 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSb*b@bo p cc0c1c% ' (b)b, uc_cfdd e f ( hdidjdkdldmdndodpdqd

111 cydriver.CUpointer_attribute.CU_POINTER_ATTRIBUTE_MEMORY_TYPE, 

112 cydriver.CUpointer_attribute.CU_POINTER_ATTRIBUTE_IS_MANAGED, 

113 cydriver.CUpointer_attribute.CU_POINTER_ATTRIBUTE_DEVICE_ORDINAL, 

114 ] 

115 cdef uintptr_t[3] vals = [ 2vcq 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 pc~b=g?g@g[gghHhIh^c]g^ghhih'bJh_gacbc2bqceca b c 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSb*b@bo p cc0c1c% ' (b)b, uc_cfdd e f ( hdidjdkdldmdndodpdqd

116 <uintptr_t><void*>&memory_type, 

117 <uintptr_t><void*>&is_managed, 

118 <uintptr_t><void*>&device_id, 

119 ] 

120  

121 cdef cydriver.CUresult ret 

122 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 pc~b=g?g@g[gghHhIh^c]g^ghhih'bJh_gacbc2bqceca b c 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSb*b@bo p cc0c1c% ' (b)b, uc_cfdd e f ( hdidjdkdldmdndodpdqd

123 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 pc~b=g?g@g[gghHhIh^c]g^ghhih'bJh_gacbc2bqceca b c 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSb*b@bo p cc0c1c% ' (b)b, uc_cfdd e f ( hdidjdkdldmdndodpdqd

124 with cython.gil: 

125 # Device class handles the cuInit call internally 

126 Device() 

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

128 HANDLE_RETURN(ret) 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 pc~b=g?g@g[gghHhIh^c]g^ghhih'bJh_gacbc2bqceca b c 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSb*b@bo p cc0c1c% ' (b)b, uc_cfdd e f ( hdidjdkdldmdndodpdqd

129  

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

131 # CU_POINTER_ATTRIBUTE_IS_MANAGED query does not capture that yet. 

132 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 pc~b=g?g@g[gghHhIh^c]g^ghhih'bJh_gacbc2bqceca b c 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSb*b@bo p cc0c1c% ' (b)b, uc_cfdd e f ( hdidjdkdldmdndodpdqd

133  

134 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 pc~b=g?g@g[gghHhIh^c]g^ghhih'bJh_gacbc2bqceca b c 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSb*b@bo p cc0c1c% ' (b)b, uc_cfdd e f ( hdidjdkdldmdndodpdqd

135 # unregistered host pointer 

136 out.is_host_accessible = True 2cc(b)bhdidjdkdldmdndodpdqd

137 out.is_device_accessible = False 2cc(b)bhdidjdkdldmdndodpdqd

138 out.device_id = -1 2cc(b)bhdidjdkdldmdndodpdqd

139 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 pc~b=g?g@g[gghHhIh^c]g^ghhih'bJh_gacbc2bqceca b c 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSb*b@bo p 0c1c% ' (b)b, uc_cfdd e f (

140 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 pc~b=g?g@g[gghHhIh^c]g^ghhih'bJh_gacbc2bqceca b c 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSb*b@bo p 0c1c% ' (b)b, uc_cfdd e f (

141 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 2bqceca b c 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSb*bo p % ' (b)b_cfdd e f (

142 ): 

143 # Managed memory or pinned host memory 

144 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 pc~b=g?g@g[gghHhIh^c]g^ghhih'bJh_gacbca b c 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSb*b@b0c1c% ' (b)b, ucfdd e f

145 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 pc~b=g?g@g[gghHhIh^c]g^ghhih'bJh_gacbca b c 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSb*b@b0c1c% ' (b)b, ucfdd e f

146 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 pc~b=g?g@g[gghHhIh^c]g^ghhih'bJh_gacbca b c 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSb*b@b0c1c% ' (b)b, ucfdd e f

147 elif memory_type == cydriver.CUmemorytype.CU_MEMORYTYPE_DEVICE: 22bqceco p _c(

148 out.is_host_accessible = False 22bqceco p _c(

149 out.is_device_accessible = True 22bqceco p _c(

150 out.device_id = device_id 22bqceco p _c(

151 else: 

152 with cython.gil: 

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

154 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 pc~b=g?g@g[gghHhIh^c]g^ghhih'bJh_gacbc2bqceca b c 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSb*b@bo p cc0c1c% ' (b)b, uc_cfdd e f ( hdidjdkdldmdndodpdqd

155  

156  

157cdef inline void _init_memory_attrs(Buffer self): 

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

159 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 pc~b=g?g@g[gghHhIh^c]g^ghhih'bJh_gacbc2bqceca b c 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSb*b@bo p cc0c1c% ' (b)b, uc_cfdd e f ( hdidjdkdldmdndodpdqd

160 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 pc~b=g?g@g[gghHhIh^c]g^ghhih'bJh_gacbc2bqceca b c 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSb*b@bo p cc0c1c% ' (b)b, uc_cfdd e f ( hdidjdkdldmdndodpdqd

161 _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 pc~b=g?g@g[gghHhIh^c]g^ghhih'bJh_gacbc2bqceca b c 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSb*b@bo p cc0c1c% ' (b)b, uc_cfdd e f ( hdidjdkdldmdndodpdqd

162 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 pc~b=g?g@g[gghHhIh^c]g^ghhih'bJh_gacbc2bqceca b c 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSb*b@bo p cc0c1c% ' (b)b, uc_cfdd e f ( hdidjdkdldmdndodpdqd

163  

164  

165cdef bint _stream_is_capturing(Stream s): 

166 cdef cydriver.CUstreamCaptureStatus cap_status 

167 IF CUDA_CORE_BUILD_MAJOR >= 13: 

168 HANDLE_RETURN(cydriver.cuStreamGetCaptureInfo(as_cu(s._h_stream), &cap_status, 2g !bXbh i j #bxcYbwcZb5b$b%b0b1b

169 NULL, NULL, NULL, NULL, NULL)) 

170 ELSE: 

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

172 NULL, NULL, NULL, NULL)) 

173 return cap_status == cydriver.CU_STREAM_CAPTURE_STATUS_ACTIVE 2g !bXbh i j #bxcYbwcZb5b$b%b0b1b

174  

175  

176cdef void _do_copy_with_attributes( 

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

178 object options, cydriver.CUstream hstream, 

179): 

180 IF CUDA_CORE_BUILD_MAJOR >= 13: 

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

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

183 cdef cydriver.CUmemcpyAttributes cu_attr = _to_cu_memcpy_attributes(options) 2g !bXbh i j #bYbZb5b$b%b0b1b

184 with nogil: 2g !bXbh i j #bYbZb5b$b%b0b1b

185 HANDLE_RETURN(memcpy_with_attributes_async(dst, src, nbytes, <void*>&cu_attr, hstream)) 2g !bXbh i j #bYbZb5b$b%b0b1b

186 ELSE: 

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

188  

189  

190cdef void _dispatch_buffer_copy( 

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

192 Stream s, object options, str method_name, 

193): 

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

195 if options is None: 2. / : ; [b]b^b_b`b{b|bocdc) -b7 8 9 n ! * # .bk l m $ /b:b;b=brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1b+ gchcicjckclc3b4bmcncTbUb6b7bVbWba b c lemene`czcGdHdIdd e f

196 with nogil: 2. / : ; [b]b^b_b`b{b|bocdc) -b7 8 9 n ! * # .bk l m $ /b:b;b=bg h i ?bj fc}byc+ gchcicjckclc3b4bmcncTbUb6b7bVbWba b c lemene`czcGdHdIdd e f

197 HANDLE_RETURN(cydriver.cuMemcpyAsync(dst, src, nbytes, as_cu(s._h_stream))) 2. / : ; [b]b^b_b`b{b|bocdc) -b7 8 9 n ! * # .bk l m $ /b:b;b=bg h i ?bj fc}byc+ gchcicjckclc3b4bmcncTbUb6b7bVbWba b c lemene`czcGdHdIdd e f

198 return 2. / : ; [b]b^b_b`b{b|bocdc) -b7 8 9 n ! * # .bk l m $ /b:b;b=bg h i ?bj fc}byc+ gchcicjckclc3b4bmcncTbUb6b7bVbWba b c lemene`czcGdHdIdd e f

199 if not isinstance(options, CopyOptions): 2rcsctcg !bXbh i ?bj #bxcYbwcZb5b$b%b0b1b

200 raise TypeError( 2rcsctc

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

202 ) 

203 if Stream_is_legacy_default_token(s): 2g !bXbh i ?bj #bxcYbwcZb5b$b%b0b1b

204 raise TypeError( 2?b

205 f"{method_name} does not accept LEGACY_DEFAULT_STREAM with options " 2?b

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

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

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

209 "or options=None." 

210 ) 

211 if _stream_is_capturing(s): 2g !bXbh i j #bxcYbwcZb5b$b%b0b1b

212 raise TypeError( 2xcwc

213 f"{method_name} does not support graph capture with options " 2xcwc

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

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

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

217 "options=None." 

218 ) 

219 if _with_attributes_available(): 2g !bXbh i j #bYbZb5b$b%b0b1b

220 _do_copy_with_attributes(dst, src, nbytes, options, as_cu(s._h_stream)) 2g !bXbh i j #bYbZb5b$b%b0b1b

221 else: 

222 _reject_unsupported_during_api_call( 

223 options.src_access_order, 

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

225 "(cuMemcpyWithAttributesAsync is unavailable here)", 

226 ) 

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

228 # cuMemcpyAsync satisfies them; options are otherwise silently 

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

230 with nogil: 

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

232  

233  

234cdef class Buffer: 

235 """Represent a handle to allocated memory. 

236  

237 This generic object provides a unified representation for how 

238 different memory resources are to give access to their memory 

239 allocations. 

240  

241 Support for data interchange mechanisms are provided by DLPack. 

242  

243 Note 

244 ---- 

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

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

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

248 import. Do not unpickle buffers from untrusted sources. 

249 """ 

250 def __cinit__(self) -> None: 

251 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 jhkh9elhmhnhKhhiiioh,ephqh-e.egirhshLhthW X Y Z 0 1 - MhNhOhjikili. / : ; [b]b^b_b`b{b|b}h~hai]f^f_f=e?eagbg@ecg[e]edgegfgggMgNgOgPgQghgigjgRgSgTgUgVgWgXgkglgmgngogpgqgrgsgtgugvgwgxgygzg^eocdcAgoeYgBg2 3 4 `f{f|f) _e9b`e-b{e7 8 9 |en }e! ~eafbf* cf# df.befk l m $ /bff:bgf;bhf=bifjfkflfmfnfofpfqf+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1bpc~b1g2g3g4g5gPhpe6gmi^c7gni8goi'b9g!gacbc:e;e`g{g|g2buhvhwhxhyhzhAhBh+ gchcbhchCh6hDh7h#g8hEh9hFh!h$g#h%g'gdheh(g)gicjckclc3b4bmcnc*g+g,g-gTbUb6b7bVbWbqereCgDgQhHgGh}gIgRhqc/e.g/geca b c !elemene5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbseheJd`crdzcUd3eEgsd4eNite(eXe)e*b@b2co p cc0c1c% ' (b)bueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdgeie*e:g;gGdKdYeZeahfh5e#eFgZgGg0g}f, ucrfHdbicidiShThUhVhWhXhYhZh0h1h2h3h4hJg0e~fWdVe1eLd_cfdKg+eId8eLg5hWe2edejekeeefed e f sftf~gufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[fFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded( hdidjd3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebeceeikd$eldmdndodpdqd8b

252  

253 def _clear(self) -> None: 

254 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 jhkh9elhmhnhKhhiiioh,ephqh-e.egirhshLhthW X Y Z 0 1 - MhNhOhjikili. / : ; [b]b^b_b`b{b|b}h~hai]f^f_f=e?eagbg@ecg[e]edgegfgggMgNgOgPgQghgigjgRgSgTgUgVgWgXgkglgmgngogpgqgrgsgtgugvgwgxgygzg^eocdcAgoeYgBg2 3 4 `f{f|f) _e9b`e-b{e7 8 9 |en }e! ~eafbf* cf# df.befk l m $ /bff:bgf;bhf=bifjfkflfmfnfofpfqf+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1bpc~b1g2g3g4g5gPhpe6gmi^c7gni8goi'b9g!gacbc:e;e`g{g|g2buhvhwhxhyhzhAhBh+ gchcbhchCh6hDh7h#g8hEh9hFh!h$g#h%g'gdheh(g)gicjckclc3b4bmcnc*g+g,g-gTbUb6b7bVbWbqereCgDgQhHgGh}gIgRhqc/e.g/geca b c !elemene5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbseheJd`crdzcUd3eEgsd4eNite(eXe)e*b@b2co p cc0c1c% ' (b)bueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdgeie*e:g;gGdKdYeZeahfh5e#eFgZgGg0g}f, ucrfHdbicidiShThUhVhWhXhYhZh0h1h2h3h4hJg0e~fWdVe1eLd_cfdKg+eId8eLg5hWe2edejekeeefed e f sftf~gufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[fFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded( hdidjd3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebeceeikd$eldmdndodpdqd8b

255 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 jhkh9elhmhnhKhhiiioh,ephqh-e.egirhshLhthW X Y Z 0 1 - MhNhOhjikili. / : ; [b]b^b_b`b{b|b}h~hai]f^f_f=e?eagbg@ecg[e]edgegfgggMgNgOgPgQghgigjgRgSgTgUgVgWgXgkglgmgngogpgqgrgsgtgugvgwgxgygzg^eocdcAgoeYgBg2 3 4 `f{f|f) _e9b`e-b{e7 8 9 |en }e! ~eafbf* cf# df.befk l m $ /bff:bgf;bhf=bifjfkflfmfnfofpfqf+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1bpc~b1g2g3g4g5gPhpe6gmi^c7gni8goi'b9g!gacbc:e;e`g{g|g2buhvhwhxhyhzhAhBh+ gchcbhchCh6hDh7h#g8hEh9hFh!h$g#h%g'gdheh(g)gicjckclc3b4bmcnc*g+g,g-gTbUb6b7bVbWbqereCgDgQhHgGh}gIgRhqc/e.g/geca b c !elemene5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbseheJd`crdzcUd3eEgsd4eNite(eXe)e*b@b2co p cc0c1c% ' (b)bueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdgeie*e:g;gGdKdYeZeahfh5e#eFgZgGg0g}f, ucrfHdbicidiShThUhVhWhXhYhZh0h1h2h3h4hJg0e~fWdVe1eLd_cfdKg+eId8eLg5hWe2edejekeeefed e f sftf~gufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[fFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded( hdidjd3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebeceeikd$eldmdndodpdqd8b

256 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 jhkh9elhmhnhKhhiiioh,ephqh-e.egirhshLhthW X Y Z 0 1 - MhNhOhjikili. / : ; [b]b^b_b`b{b|b}h~hai]f^f_f=e?eagbg@ecg[e]edgegfgggMgNgOgPgQghgigjgRgSgTgUgVgWgXgkglgmgngogpgqgrgsgtgugvgwgxgygzg^eocdcAgoeYgBg2 3 4 `f{f|f) _e9b`e-b{e7 8 9 |en }e! ~eafbf* cf# df.befk l m $ /bff:bgf;bhf=bifjfkflfmfnfofpfqf+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1bpc~b1g2g3g4g5gPhpe6gmi^c7gni8goi'b9g!gacbc:e;e`g{g|g2buhvhwhxhyhzhAhBh+ gchcbhchCh6hDh7h#g8hEh9hFh!h$g#h%g'gdheh(g)gicjckclc3b4bmcnc*g+g,g-gTbUb6b7bVbWbqereCgDgQhHgGh}gIgRhqc/e.g/geca b c !elemene5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbseheJd`crdzcUd3eEgsd4eNite(eXe)e*b@b2co p cc0c1c% ' (b)bueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdgeie*e:g;gGdKdYeZeahfh5e#eFgZgGg0g}f, ucrfHdbicidiShThUhVhWhXhYhZh0h1h2h3h4hJg0e~fWdVe1eLd_cfdKg+eId8eLg5hWe2edejekeeefed e f sftf~gufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[fFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded( hdidjd3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebeceeikd$eldmdndodpdqd8b

257 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 jhkh9elhmhnhKhhiiioh,ephqh-e.egirhshLhthW X Y Z 0 1 - MhNhOhjikili. / : ; [b]b^b_b`b{b|b}h~hai]f^f_f=e?eagbg@ecg[e]edgegfgggMgNgOgPgQghgigjgRgSgTgUgVgWgXgkglgmgngogpgqgrgsgtgugvgwgxgygzg^eocdcAgoeYgBg2 3 4 `f{f|f) _e9b`e-b{e7 8 9 |en }e! ~eafbf* cf# df.befk l m $ /bff:bgf;bhf=bifjfkflfmfnfofpfqf+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1bpc~b1g2g3g4g5gPhpe6gmi^c7gni8goi'b9g!gacbc:e;e`g{g|g2buhvhwhxhyhzhAhBh+ gchcbhchCh6hDh7h#g8hEh9hFh!h$g#h%g'gdheh(g)gicjckclc3b4bmcnc*g+g,g-gTbUb6b7bVbWbqereCgDgQhHgGh}gIgRhqc/e.g/geca b c !elemene5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbseheJd`crdzcUd3eEgsd4eNite(eXe)e*b@b2co p cc0c1c% ' (b)bueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdgeie*e:g;gGdKdYeZeahfh5e#eFgZgGg0g}f, ucrfHdbicidiShThUhVhWhXhYhZh0h1h2h3h4hJg0e~fWdVe1eLd_cfdKg+eId8eLg5hWe2edejekeeefed e f sftf~gufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[fFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded( hdidjd3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebeceeikd$eldmdndodpdqd8b

258 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 jhkh9elhmhnhKhhiiioh,ephqh-e.egirhshLhthW X Y Z 0 1 - MhNhOhjikili. / : ; [b]b^b_b`b{b|b}h~hai]f^f_f=e?eagbg@ecg[e]edgegfgggMgNgOgPgQghgigjgRgSgTgUgVgWgXgkglgmgngogpgqgrgsgtgugvgwgxgygzg^eocdcAgoeYgBg2 3 4 `f{f|f) _e9b`e-b{e7 8 9 |en }e! ~eafbf* cf# df.befk l m $ /bff:bgf;bhf=bifjfkflfmfnfofpfqf+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1bpc~b1g2g3g4g5gPhpe6gmi^c7gni8goi'b9g!gacbc:e;e`g{g|g2buhvhwhxhyhzhAhBh+ gchcbhchCh6hDh7h#g8hEh9hFh!h$g#h%g'gdheh(g)gicjckclc3b4bmcnc*g+g,g-gTbUb6b7bVbWbqereCgDgQhHgGh}gIgRhqc/e.g/geca b c !elemene5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbseheJd`crdzcUd3eEgsd4eNite(eXe)e*b@b2co p cc0c1c% ' (b)bueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdgeie*e:g;gGdKdYeZeahfh5e#eFgZgGg0g}f, ucrfHdbicidiShThUhVhWhXhYhZh0h1h2h3h4hJg0e~fWdVe1eLd_cfdKg+eId8eLg5hWe2edejekeeefed e f sftf~gufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[fFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded( hdidjd3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebeceeikd$eldmdndodpdqd8b

259 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 jhkh9elhmhnhKhhiiioh,ephqh-e.egirhshLhthW X Y Z 0 1 - MhNhOhjikili. / : ; [b]b^b_b`b{b|b}h~hai]f^f_f=e?eagbg@ecg[e]edgegfgggMgNgOgPgQghgigjgRgSgTgUgVgWgXgkglgmgngogpgqgrgsgtgugvgwgxgygzg^eocdcAgoeYgBg2 3 4 `f{f|f) _e9b`e-b{e7 8 9 |en }e! ~eafbf* cf# df.befk l m $ /bff:bgf;bhf=bifjfkflfmfnfofpfqf+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1bpc~b1g2g3g4g5gPhpe6gmi^c7gni8goi'b9g!gacbc:e;e`g{g|g2buhvhwhxhyhzhAhBh+ gchcbhchCh6hDh7h#g8hEh9hFh!h$g#h%g'gdheh(g)gicjckclc3b4bmcnc*g+g,g-gTbUb6b7bVbWbqereCgDgQhHgGh}gIgRhqc/e.g/geca b c !elemene5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbseheJd`crdzcUd3eEgsd4eNite(eXe)e*b@b2co p cc0c1c% ' (b)bueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdgeie*e:g;gGdKdYeZeahfh5e#eFgZgGg0g}f, ucrfHdbicidiShThUhVhWhXhYhZh0h1h2h3h4hJg0e~fWdVe1eLd_cfdKg+eId8eLg5hWe2edejekeeefed e f sftf~gufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[fFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded( hdidjd3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebeceeikd$eldmdndodpdqd8b

260  

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

262 raise RuntimeError("Buffer objects cannot be instantiated directly. " 2Ni

263 "Please use MemoryResource APIs.") 

264  

265 @classmethod 

266 def _init( 

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

268 ipc_descriptor: IPCBufferDescriptor | None = None, 

269 owner : object | None = None, 

270 *, 

271 stream: Stream | GraphBuilder | None = None, 

272 ) -> Buffer: 

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

274  

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

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

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

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

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

280 default-stream token requires a CUDA context to be current. Host-only 

281 resources (``mr.is_device_accessible`` is ``False``) record no stream 

282 and need no context. 

283 """ 

284 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 9eW X Y Z 0 1 - . / : ; [b]b^b_b`b{b|b=e?eagbg@ecg[e]edgegfgggMgNgOgPgQghgigjgRgSgTgUgVgWgXgkglgmgngogpgqgrgsgtgugvgwgxgygzg^eocdcAgoeYgBg2 3 4 ) _e9b`e-b{e7 8 9 |en }e! ~eafbf* cf# df.befk l m $ /bff:bgf;bhf=bifjfkflfmfnfofpfqf+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1b1g2g3g4g5gpe6g7g8g'b9g!g2b+ gchcicjckclc3b4bmcncTbUb6b7bVbWbqereCgDga b c !elemene5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbseheJd`crdzcUd3eEgsd4ete(eXe)e*b@b2co p cc0c1c% ' (b)bueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdgeie*eKdYeZeahfh5e#eFgZgGg0gDjEj}f, Fj0e~fWdVe1eLdKgWe2edejekeeefed e f sftf~gufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f.f/f:f;f=f?f@f[fFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded( hdidjd3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebeceeikd$eldmdndodpdqd8b

285 raise ValueError("owner and memory resource cannot be both specified together") 2Fj

286 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 9eW X Y Z 0 1 - . / : ; [b]b^b_b`b{b|b=e?eagbg@ecg[e]edgegfgggMgNgOgPgQghgigjgRgSgTgUgVgWgXgkglgmgngogpgqgrgsgtgugvgwgxgygzg^eocdcAgoeYgBg2 3 4 ) _e9b`e-b{e7 8 9 |en }e! ~eafbf* cf# df.befk l m $ /bff:bgf;bhf=bifjfkflfmfnfofpfqf+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1b1g2g3g4g5gpe6g7g8g'b9g!g2b+ gchcicjckclc3b4bmcncTbUb6b7bVbWbqereCgDga b c !elemene5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbseheJd`crdzcUd3eEgsd4ete(eXe)e*b@b2co p cc0c1c% ' (b)bueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdgeie*eKdYeZeahfh5e#eFgZgGg0gDjEj}f, 0e~fWdVe1eLdKgWe2edejekeeefed e f sftf~gufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f.f/f:f;f=f?f@f[fFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded( hdidjd3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebeceeikd$eldmdndodpdqd8b

287 raise ValueError("stream requires a memory resource (mr)") 2DjEj

288 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 9eW X Y Z 0 1 - . / : ; [b]b^b_b`b{b|b=e?eagbg@ecg[e]edgegfgggMgNgOgPgQghgigjgRgSgTgUgVgWgXgkglgmgngogpgqgrgsgtgugvgwgxgygzg^eocdcAgoeYgBg2 3 4 ) _e9b`e-b{e7 8 9 |en }e! ~eafbf* cf# df.befk l m $ /bff:bgf;bhf=bifjfkflfmfnfofpfqf+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1b1g2g3g4g5gpe6g7g8g'b9g!g2b+ gchcicjckclc3b4bmcncTbUb6b7bVbWbqereCgDga b c !elemene5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbseheJd`crdzcUd3eEgsd4ete(eXe)e*b@b2co p cc0c1c% ' (b)bueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdgeie*eKdYeZeahfh5e#eFgZgGg0g}f, 0e~fWdVe1eLdKgWe2edejekeeefed e f sftf~gufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f.f/f:f;f=f?f@f[fFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded( hdidjd3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebeceeikd$eldmdndodpdqd8b

289 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 9eW X Y Z 0 1 - . / : ; [b]b^b_b`b{b|b=e?eagbg@ecg[e]edgegfgggMgNgOgPgQghgigjgRgSgTgUgVgWgXgkglgmgngogpgqgrgsgtgugvgwgxgygzg^eocdcAgoeYgBg2 3 4 ) _e9b`e-b{e7 8 9 |en }e! ~eafbf* cf# df.befk l m $ /bff:bgf;bhf=bifjfkflfmfnfofpfqf+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1b1g2g3g4g5gpe6g7g8g'b9g!g2b+ gchcicjckclc3b4bmcncTbUb6b7bVbWbqereCgDga b c !elemene5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbseheJd`crdzcUd3eEgsd4ete(eXe)e*b@b2co p cc0c1c% ' (b)bueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdgeie*eKdYeZeahfh5e#eFgZgGg0g}f, 0e~fWdVe1eLdKgWe2edejekeeefed e f sftf~gufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f.f/f:f;f=f?f@f[fFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded( hdidjd3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebeceeikd$eldmdndodpdqd8b

290 cdef Stream s 

291 cdef cydriver.CUresult _ds_status 

292 cdef bint record_stream 

293 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 9eW X Y Z 0 1 - . / : ; [b]b^b_b`b{b|b=e?eagbg@ecg[e]edgegfgggMgNgOgPgQghgigjgRgSgTgUgVgWgXgkglgmgngogpgqgrgsgtgugvgwgxgygzg^eocdcAgoeYgBg2 3 4 ) _e9b`e-b{e7 8 9 |en }e! ~eafbf* cf# df.befk l m $ /bff:bgf;bhf=bifjfkflfmfnfofpfqf+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1b1g2g3g4g5gpe6g7g8g'b9g!g2b+ gchcicjckclc3b4bmcncTbUb6b7bVbWbqereCgDga b c !elemene5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbseheJd`crdzcUd3eEgsd4ete(eXe)e*b@b2co p cc0c1c% ' (b)bueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdgeie*eKdYeZeahfh5e#eFgZgGg0g}f, 0e~fWdVe1eLdKgWe2edejekeeefed e f sftf~gufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f.f/f:f;f=f?f@f[fFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded( hdidjd3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebeceeikd$eldmdndodpdqd8b

294 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 9eW X Y Z 0 1 - . / : ; [b]b^b_b`b{b|b=e?eagbg@ecg[e]edgegfgggMgNgOgPgQghgigjgRgSgTgUgVgWgXgkglgmgngogpgqgrgsgtgugvgwgxgygzg^eocdcAgoeYgBg2 3 4 ) _e9b`e-b{e7 8 9 |en }e! ~eafbf* cf# df.befk l m $ /bff:bgf;bhf=bifjfkflfmfnfofpfqf+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1b1g2g3g4g5gpe6g7g8g'b9g!g2b+ gchcicjckclc3b4bmcncTbUb6b7bVbWbqereCgDga b c !elemene5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbseheJd`crdzcUd3eEgsd4ete(eXe)e*b@b2co p % ' ueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdieKdYeZeahfh5e#eFgZgGg0g}f, 0e~fWdVe1eLdWe2edejekeeefed e f sftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f.f/f:f;f=f?f@f[fFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded( 3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebece$e8b

295 # Host-only memory needs no CUDA context to free, so no deallocation 

296 # stream is recorded and the driver is not called. 

297 record_stream = mr.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 9eW X Y Z 0 1 - . / : ; [b]b^b_b`b{b|b=e?eagbg@ecg[e]edgegfgggMgNgOgPgQghgigjgRgSgTgUgVgWgXgkglgmgngogpgqgrgsgtgugvgwgxgygzg^eocdcAgoeYgBg2 3 4 ) _e9b`e-b{e7 8 9 |en }e! ~eafbf* cf# df.befk l m $ /bff:bgf;bhf=bifjfkflfmfnfofpfqf+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1b1g2g3g4g5gpe6g7g8g'b9g!g2b+ gchcicjckclc3b4bmcncTbUb6b7bVbWbqereCgDga b c !elemene5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbseheJd`crdzcUd3eEgsd4ete(eXe)e*b@b2co p % ' ueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdieKdYeZeahfh5e#eFgZgGg0g}f, 0e~fWdVe1eLdWe2edejekeeefed e f sftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f.f/f:f;f=f?f@f[fFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded( 3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebece$e8b

298 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 9eW X Y Z 0 1 - . / : ; [b]b^b_b`b{b|b=e?eagbg@ecg[e]edgegfgggMgNgOgPgQghgigjgRgSgTgUgVgWgXgkglgmgngogpgqgrgsgtgugvgwgxgygzg^eocdcAgoeYgBg2 3 4 ) _e9b`e-b{e7 8 9 |en }e! ~eafbf* cf# df.befk l m $ /bff:bgf;bhf=bifjfkflfmfnfofpfqf+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1b1g2g3g4g5gpe6g7g8g'b9g!g2b+ gchcicjckclc3b4bmcncTbUb6b7bVbWbqereCgDga b c !elemene5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbseheJd`crdzcUd3eEgsd4ete(eXe)e*b@b2co p % ' ueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdieKdYeZeahfh5e#eFgZgGg0g}f, 0e~fWdVe1eLdWe2edejekeeefed e f sftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f.f/f:f;f=f?f@f[fFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded( 3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebece$e8b

299 if record_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 9eW X Y Z 0 1 - . / : ; [b]b^b_b`b{b|b=e?eagbg@ecg[e]edgegfgggMgNgOgPgQghgigjgRgSgTgUgVgWgXgkglgmgngogpgqgrgsgtgugvgwgxgygzg^eocdcAgoeYgBg2 3 4 ) _e9b`e-b{e7 8 9 |en }e! ~eafbf* cf# df.befk l m $ /bff:bgf;bhf=bifjfkflfmfnfofpfqf+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1b1g2g3g4g5gpe6g7g8g'b9g!g2b+ gchcicjckclc3b4bmcncTbUb6b7bVbWbqereCgDga b c !elemene5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbseheJd`crdzcUd3eEgsd4ete(eXe)e*b@b2co p % ' ueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdieKdYeZeahfh5e#eFgZgGg0g}f, 0e~fWdVe1eLdWe2edejekeeefed e f sftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f.f/f:f;f=f?f@f[fFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded( 3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebece$e8b

300 _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 9eW X Y Z 0 1 - . / : ; [b]b^b_b`b{b|b=e?eagbg@ecg[e]edgegfgggMgNgOgPgQghgigjgRgSgTgUgVgWgXgkglgmgngogpgqgrgsgtgugvgwgxgygzg^eocdcAgoeYgBg2 3 4 ) _e9b`e-b{e7 8 9 |en }e! ~eafbf* cf# df.befk l m $ /bff:bgf;bhf=bifjfkflfmfnfofpfqf+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1b1g2g3g4g5gpe6g7g8g'b9g!g2b+ gchcicjckclc3b4bmcncTbUb6b7bVbWbqereCgDga b c !elemene5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbseheJd`crdzcUd3eEgsd4eXe*b@b2co p % ' ueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdieKdahfh5e#eFgZgGg0g}f, 0e~fWdVe1eLdWe2edejekeeefed e f sftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f.f/f:f;f=f?f@f[fFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded( 3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebece$e8b

301 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 9eW X Y Z 0 1 - . / : ; [b]b^b_b`b{b|b=e?eagbg@ecg[e]edgegfgggMgNgOgPgQghgigjgRgSgTgUgVgWgXgkglgmgngogpgqgrgsgtgugvgwgxgygzg^eocdcAgoeYgBg2 3 4 ) _e9b`e-b{e7 8 9 |en }e! ~eafbf* cf# df.befk l m $ /bff:bgf;bhf=bifjfkflfmfnfofpfqf+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1b1g2g3g4g5gpe6g7g8g'b9g!g2b+ gchcicjckclc3b4bmcncTbUb6b7bVbWbqereCgDga b c !elemene5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbseheJd`crdzcUd3eEgsd4eXe*b@b2co p % ' ueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdieKdahfh5e#eFgZgGg0g}f, 0e~fWdVe1eLdWe2edejekeeefed e f sftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f.f/f:f;f=f?f@f[fFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded( 3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebece$e8b

302 # Reset before raising: the DevicePtrHandle destructor would otherwise 

303 # invoke _mr_dealloc_callback, which catches any inner exception and 

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

305 self._h_ptr.reset() 2ahfh

306 if _ds_status == cydriver.CUresult.CUDA_ERROR_INVALID_CONTEXT: 2ahfh

307 raise RuntimeError( 2ahfh

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

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

310 "non-default Stream." 

311 ) 

312 HANDLE_RETURN(_ds_status) 

313 else: 

314 self._h_ptr = deviceptr_create_with_owner(c_ptr, owner) 21g2g3g4g5gpe6g7g8g'b9g!g2bo p cc0c1c% ' (b)bge*eKg~g( hdidjdeikdldmdndodpdqd

315 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 9eW X Y Z 0 1 - . / : ; [b]b^b_b`b{b|b=e?eagbg@ecg[e]edgegfgggMgNgOgPgQghgigjgRgSgTgUgVgWgXgkglgmgngogpgqgrgsgtgugvgwgxgygzg^eocdcAgoeYgBg2 3 4 ) _e9b`e-b{e7 8 9 |en }e! ~eafbf* cf# df.befk l m $ /bff:bgf;bhf=bifjfkflfmfnfofpfqf+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1b1g2g3g4g5gpe6g7g8g'b9g!g2b+ gchcicjckclc3b4bmcncTbUb6b7bVbWbqereCgDga b c !elemene5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbseheJd`crdzcUd3eEgsd4ete(eXe)e*b@b2co p cc0c1c% ' (b)bueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdgeie*eKdYeZe5e#eFgZgGg0g}f, 0e~fWdVe1eLdKgWe2edejekeeefed e f sftf~gufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f.f/f:f;f=f?f@f[fFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded( hdidjd3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebeceeikd$eldmdndodpdqd8b

316 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 9eW X Y Z 0 1 - . / : ; [b]b^b_b`b{b|b=e?eagbg@ecg[e]edgegfgggMgNgOgPgQghgigjgRgSgTgUgVgWgXgkglgmgngogpgqgrgsgtgugvgwgxgygzg^eocdcAgoeYgBg2 3 4 ) _e9b`e-b{e7 8 9 |en }e! ~eafbf* cf# df.befk l m $ /bff:bgf;bhf=bifjfkflfmfnfofpfqf+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1b1g2g3g4g5gpe6g7g8g'b9g!g2b+ gchcicjckclc3b4bmcncTbUb6b7bVbWbqereCgDga b c !elemene5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbseheJd`crdzcUd3eEgsd4ete(eXe)e*b@b2co p cc0c1c% ' (b)bueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdgeie*eKdYeZe5e#eFgZgGg0g}f, 0e~fWdVe1eLdKgWe2edejekeeefed e f sftf~gufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f.f/f:f;f=f?f@f[fFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded( hdidjd3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebeceeikd$eldmdndodpdqd8b

317 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 9eW X Y Z 0 1 - . / : ; [b]b^b_b`b{b|b=e?eagbg@ecg[e]edgegfgggMgNgOgPgQghgigjgRgSgTgUgVgWgXgkglgmgngogpgqgrgsgtgugvgwgxgygzg^eocdcAgoeYgBg2 3 4 ) _e9b`e-b{e7 8 9 |en }e! ~eafbf* cf# df.befk l m $ /bff:bgf;bhf=bifjfkflfmfnfofpfqf+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1b1g2g3g4g5gpe6g7g8g'b9g!g2b+ gchcicjckclc3b4bmcncTbUb6b7bVbWbqereCgDga b c !elemene5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbseheJd`crdzcUd3eEgsd4ete(eXe)e*b@b2co p cc0c1c% ' (b)bueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdgeie*eKdYeZe5e#eFgZgGg0g}f, 0e~fWdVe1eLdKgWe2edejekeeefed e f sftf~gufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f.f/f:f;f=f?f@f[fFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded( hdidjd3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebeceeikd$eldmdndodpdqd8b

318 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 9eW X Y Z 0 1 - . / : ; [b]b^b_b`b{b|b=e?eagbg@ecg[e]edgegfgggMgNgOgPgQghgigjgRgSgTgUgVgWgXgkglgmgngogpgqgrgsgtgugvgwgxgygzg^eocdcAgoeYgBg2 3 4 ) _e9b`e-b{e7 8 9 |en }e! ~eafbf* cf# df.befk l m $ /bff:bgf;bhf=bifjfkflfmfnfofpfqf+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1b1g2g3g4g5gpe6g7g8g'b9g!g2b+ gchcicjckclc3b4bmcncTbUb6b7bVbWbqereCgDga b c !elemene5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbseheJd`crdzcUd3eEgsd4ete(eXe)e*b@b2co p cc0c1c% ' (b)bueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdgeie*eKdYeZe5e#eFgZgGg0g}f, 0e~fWdVe1eLdKgWe2edejekeeefed e f sftf~gufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f.f/f:f;f=f?f@f[fFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded( hdidjd3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebeceeikd$eldmdndodpdqd8b

319 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 9eW X Y Z 0 1 - . / : ; [b]b^b_b`b{b|b=e?eagbg@ecg[e]edgegfgggMgNgOgPgQghgigjgRgSgTgUgVgWgXgkglgmgngogpgqgrgsgtgugvgwgxgygzg^eocdcAgoeYgBg2 3 4 ) _e9b`e-b{e7 8 9 |en }e! ~eafbf* cf# df.befk l m $ /bff:bgf;bhf=bifjfkflfmfnfofpfqf+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1b1g2g3g4g5gpe6g7g8g'b9g!g2b+ gchcicjckclc3b4bmcncTbUb6b7bVbWbqereCgDga b c !elemene5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbseheJd`crdzcUd3eEgsd4ete(eXe)e*b@b2co p cc0c1c% ' (b)bueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdgeie*eKdYeZe5e#eFgZgGg0g}f, 0e~fWdVe1eLdKgWe2edejekeeefed e f sftf~gufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f.f/f:f;f=f?f@f[fFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded( hdidjd3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebeceeikd$eldmdndodpdqd8b

320 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 9eW X Y Z 0 1 - . / : ; [b]b^b_b`b{b|b=e?eagbg@ecg[e]edgegfgggMgNgOgPgQghgigjgRgSgTgUgVgWgXgkglgmgngogpgqgrgsgtgugvgwgxgygzg^eocdcAgoeYgBg2 3 4 ) _e9b`e-b{e7 8 9 |en }e! ~eafbf* cf# df.befk l m $ /bff:bgf;bhf=bifjfkflfmfnfofpfqf+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1b1g2g3g4g5gpe6g7g8g'b9g!g2b+ gchcicjckclc3b4bmcncTbUb6b7bVbWbqereCgDga b c !elemene5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbseheJd`crdzcUd3eEgsd4ete(eXe)e*b@b2co p cc0c1c% ' (b)bueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdgeie*eKdYeZe5e#eFgZgGg0g}f, 0e~fWdVe1eLdKgWe2edejekeeefed e f sftf~gufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f.f/f:f;f=f?f@f[fFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded( hdidjd3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebeceeikd$eldmdndodpdqd8b

321  

322 @staticmethod 

323 def _reduce_helper(mr, ipc_descriptor): 

324 cdef ContextHandle h_ctx = get_current_context() 

325 cdef int device_id 

326 if not h_ctx: 

327 # Spawned processes unpickle arguments before entering their target, 

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

329 device_id = mr.device_id 

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

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

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

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

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

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

336  

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

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

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

340 # Must not serialize the parent's stream! 

341 Buffer_check_open(self) 2uhvhwhxhyhzhAhBhgchcChDh#gEhFh$g%g'g(g)gicjckclc3b4bmcnc*g+g,g-gTbUbVbWb

342 return Buffer._reduce_helper, (self.memory_resource, self.ipc_descriptor) 2uhvhwhxhyhzhAhBhgchcChDh#gEhFh$g%g'g(g)gicjckclc3b4bmcnc*g+g,g-gTbUbVbWb

343  

344 @staticmethod 

345 def from_handle( 

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

347 owner: object | None = None, 

348 *, 

349 stream: Stream | GraphBuilder | None = None, 

350 ) -> Buffer: 

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

352  

353 Parameters 

354 ---------- 

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

356 Allocated buffer handle object 

357 size : int 

358 Memory size of the buffer 

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

360 Memory resource associated with the buffer. When provided, 

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

362 closed or garbage collected. 

363 owner : object, optional 

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

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

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

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

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

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

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

371 current. Host-only resources (``mr.is_device_accessible`` is 

372 ``False``) record no stream and need no context. If the buffer may 

373 be freed from a different host thread, 

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

375 refers to a different stream on each thread. 

376  

377 Note 

378 ---- 

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

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

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

382 """ 

383 return Buffer._init(ptr, size, mr=mr, owner=owner, stream=stream) 2. / : ; [b]b^b_b`b{b|b) 9b-b7 8 * # .bk l m $ /b:b;b=bg !bXbh i j #bYbfc}bZb$b%b0b1b1g2g3g4g5gpe6g7g8g'b9g!g2b+ gchcicjckclc3b4bmcncTbUb6b7bVbWblemeneseheJd`crdzcUd3eEgsd4ete(eXe)e*b@b2co p cc0c1c% ' (b)bueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdgeie*eKdYeZeah5eFgGgDj, Fj0e~fWdVe1eLdKgWejekeeefe~g( hdidjdeikdldmdndodpdqd

384  

385 @classmethod 

386 def from_ipc_descriptor( 

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

388 *, stream: Stream 

389 ) -> Buffer: 

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

391  

392 Parameters 

393 ---------- 

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

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

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

397 The descriptor exported from another process. 

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

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

400 the buffer is closed or garbage collected. 

401  

402 Note 

403 ---- 

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

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

406 cooperating. 

407 """ 

408 return _ipc.Buffer_from_ipc_descriptor(cls, mr, ipc_descriptor, stream) 2+ 6j7jJgLg

409  

410 @property 

411 @cython.critical_section 

412 def ipc_descriptor(self) -> IPCBufferDescriptor: 

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

414 Buffer_check_open(self) 2uhvhwhxhyhzhAhBh+ gchcbhchCh6hDh7h#g8hEh9hFh!h$g#h%g'gdheh(g)gicjckclc3b4bmcnc*g+g,g-gTbUb6b7bVbWbgeJg8eLg,f-f

415 cdef object ipc_data 

416 if self._ipc_data is None: 2uhvhwhxhyhzhAhBh+ gchcbhchCh6hDh7h#g8hEh9hFh!h$g#h%g'gdheh(g)gicjckclc3b4bmcnc*g+g,g-gTbUb6b7bVbWbJg8eLg,f-f

417 ipc_data = IPCDataForBuffer(_ipc.Buffer_get_ipc_descriptor(self), False) 2uhvhwhxhyhzhAhBh+ gchcbhchCh6hDh7h#g8hEh9hFh!h$g#h%g'gdheh(g)gicjckclc3b4bmcnc*g+g,g-gTbUb6b7bVbWbJg8eLg,f-f

418 if self._ipc_data is None: 2uhvhwhxhyhzhAhBh+ gchcbhchCh6hDh7h#g8hEh9hFh!h$g#h%g'gdheh(g)gicjckclc3b4bmcnc*g+g,g-gTbUb6b7bVbWb8e,f-f

419 self._ipc_data = ipc_data 2uhvhwhxhyhzhAhBh+ gchcbhchCh6hDh7h#g8hEh9hFh!h$g#h%g'gdheh(g)gicjckclc3b4bmcnc*g+g,g-gTbUb6b7bVbWb8e,f-f

420 return self._ipc_data.ipc_descriptor 2uhvhwhxhyhzhAhBh+ gchcbhchCh6hDh7h#g8hEh9hFh!h$g#h%g'gdheh(g)gicjckclc3b4bmcnc*g+g,g-gTbUb6b7bVbWb8e,f-f

421  

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

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

424  

425 This buffer is released back to their memory resource 

426 asynchronously on the given stream. 

427  

428 Parameters 

429 ---------- 

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

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

432 the deallocation stream stored in the handle is used. 

433  

434 See Also 

435 -------- 

436 set_deallocation_stream 

437 Change the deallocation stream without closing the buffer. 

438 """ 

439 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 jhkh9elhKh,eqh-e.erhshLhthW X Y Z 0 1 MhNhOh. / : ; [b]b^b_b`b{b|b]f^f_foe2 3 4 `f{f|f) $h9b%h-b'h7 8 9 (hn )h! *h+h,h* -h# .h.b/hk l m $ /b:h:b;h;b=h=b?h@h[h]h^h_h`h{h|h+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1bpc~bpiqirisitiPhpeuiHi^cviIiwiJi'bxiyiacbc:e;e`g{g|g2b+ 3b4bTbUb6b7bVbWbQhHgGh}gIgRhqc/e.g/gec!e5 6 seheJd`crdzcUd3esdo p cc% ' (b)bueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdgeie*e:g;gGdKdYeZe5e#erfHdShThUhVhWhXhYhZh0h1h2h3h4hJg0eWdVe1eLd_cfdKg+eId8eLg5hWe2edejekeeefefi,f-fFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded8b

440  

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

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

443  

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

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

446 pointer handle uses the replacement stream. 

447  

448 This method does not synchronize streams or establish dependencies. 

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

450 before the deallocation on ``stream``. 

451  

452 Parameters 

453 ---------- 

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

455 The stream to use for eventual asynchronous deallocation. 

456  

457 Raises 

458 ------ 

459 RuntimeError 

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

461 cannot be bound because no CUDA context is current. 

462 TypeError 

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

464  

465 Notes 

466 ----- 

467 Synchronizing concurrent mutation and destruction of the same buffer 

468 is the caller's responsibility. 

469 """ 

470 Buffer_set_deallocation_stream(self, stream) 2sd4eieWe

471  

472 def __enter__(self): 

473 return self 2oe+ Hg}gIg.g/geche2d

474  

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

476 self.close() 2oe+ Hg}gIg.g/geche2d

477 return False 2oe+ Hg}gIg.g/geche2d

478  

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

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

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

482  

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

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

485 allocated using the associated memory resource before the copy. 

486  

487 Parameters 

488 ---------- 

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

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

491 is allocated using this buffer's memory resource. 

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

493 Keyword argument specifying the stream for the 

494 asynchronous copy 

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

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

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

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

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

500 capturing stream either, since a graph cannot represent these 

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

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

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

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

505 instead of silently downgrading its guarantee. 

506  

507 Raises 

508 ------ 

509 TypeError 

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

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

512 or a stream currently in graph capture mode. 

513 RuntimeError 

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

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

516 back to a plain copy cannot honor that guarantee. 

517  

518 """ 

519 Buffer_check_open(self) 2dc9 n ! k l m rcsctcg Xbh i ?bj Ybwc}bycZb5b0b1ba b c rdzcge*eGdHdIdd e f

520 cdef Stream s = Stream_accept(stream) 2dc9 n ! k l m rcsctcg Xbh i ?bj Ybwc}bycZb5b0b1ba b c rdzcge*eGdHdIdd e f

521 cdef size_t src_size = self._size 2dc9 n ! k l m rcsctcg Xbh i ?bj Ybwc}bycZb5b0b1ba b c rdzcge*eGdHdIdd e f

522  

523 if dst is None: 2dc9 n ! k l m rcsctcg Xbh i ?bj Ybwc}bycZb5b0b1ba b c rdzcge*eGdHdIdd e f

524 if self._memory_resource is None: 2g *e

525 raise ValueError("a destination buffer must be provided (this " 2*e

526 "buffer does not have a memory_resource)") 

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

528 else: 

529 Buffer_check_open(<Buffer>dst) 2dc9 n ! k l m rcsctcg Xbh i ?bj Ybwc}bycZb5b0b1ba b c rdzcgeGdHdIdd e f

530  

531 cdef size_t dst_size = dst._size 2dc9 n ! k l m rcsctcg Xbh i ?bj Ybwc}bycZb5b0b1ba b c rdzcGdHdIdd e f

532 if dst_size != src_size: 2dc9 n ! k l m rcsctcg Xbh i ?bj Ybwc}bycZb5b0b1ba b c rdzcGdHdIdd e f

533 raise ValueError( "buffer sizes mismatch between src and dst (sizes " 2rd

534 f"are: src={src_size}, dst={dst_size})" 2rd

535 ) 

536 _dispatch_buffer_copy( 2dc9 n ! k l m rcsctcg Xbh i ?bj Ybwc}bycZb5b0b1ba b c zcGdHdIdd e f

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

538 return dst 2dc9 n ! k l m g Xbh i ?bj Yb}bycZb5b0b1ba b c zcGdHdIdd e f

539  

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

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

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

543  

544 Parameters 

545 ---------- 

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

547 Source buffer to copy data from 

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

549 Keyword argument specifying the stream for the 

550 asynchronous copy 

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

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

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

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

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

556 capturing stream either, since a graph cannot represent these 

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

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

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

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

561 instead of silently downgrading its guarantee. 

562  

563 Raises 

564 ------ 

565 TypeError 

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

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

568 or a stream currently in graph capture mode. 

569 RuntimeError 

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

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

572 back to a plain copy cannot honor that guarantee. 

573 """ 

574 Buffer_check_open(self) 2. / : ; [b]b^b_b`b{b|boc) -b7 8 * # .b$ /b:b;b=brcsctc!b?b#bxcfc5b$b%b+ gchcicjckclc3b4bmcncTbUb6b7bVbWblemeneJd`cge

575 Buffer_check_open(src) 2. / : ; [b]b^b_b`b{b|boc) -b7 8 * # .b$ /b:b;b=brcsctc!b?b#bxcfc5b$b%b+ gchcicjckclc3b4bmcncTbUb6b7bVbWblemeneJd`cge

576 cdef Stream s = Stream_accept(stream) 2. / : ; [b]b^b_b`b{b|boc) -b7 8 * # .b$ /b:b;b=brcsctc!b?b#bxcfc5b$b%b+ gchcicjckclc3b4bmcncTbUb6b7bVbWblemeneJd`c

577 cdef size_t dst_size = self._size 2. / : ; [b]b^b_b`b{b|boc) -b7 8 * # .b$ /b:b;b=brcsctc!b?b#bxcfc5b$b%b+ gchcicjckclc3b4bmcncTbUb6b7bVbWblemeneJd`c

578 cdef size_t src_size = src._size 2. / : ; [b]b^b_b`b{b|boc) -b7 8 * # .b$ /b:b;b=brcsctc!b?b#bxcfc5b$b%b+ gchcicjckclc3b4bmcncTbUb6b7bVbWblemeneJd`c

579  

580 if src_size != dst_size: 2. / : ; [b]b^b_b`b{b|boc) -b7 8 * # .b$ /b:b;b=brcsctc!b?b#bxcfc5b$b%b+ gchcicjckclc3b4bmcncTbUb6b7bVbWblemeneJd`c

581 raise ValueError( "buffer sizes mismatch between src and dst (sizes " 2Jd

582 f"are: src={src_size}, dst={dst_size})" 2Jd

583 ) 

584 _dispatch_buffer_copy( 2. / : ; [b]b^b_b`b{b|boc) -b7 8 * # .b$ /b:b;b=brcsctc!b?b#bxcfc5b$b%b+ gchcicjckclc3b4bmcncTbUb6b7bVbWblemene`c

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

586  

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

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

589  

590 Parameters 

591 ---------- 

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

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

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

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

596 Stream for the asynchronous fill operation. 

597  

598 Raises 

599 ------ 

600 TypeError 

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

602 ValueError 

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

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

605 OverflowError 

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

607  

608 """ 

609 Buffer_check_open(self) 2mhnhoh,eph-e.e. / : ; ocdc) 9bn * k l m g h i j ueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUege

610 cdef Stream s_stream = Stream_accept(stream) 2mhnhoh,eph-e.e. / : ; ocdc) 9bn * k l m g h i j ueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUe

611 cdef unsigned int val 

612 cdef unsigned int elem_size 

613 val, elem_size = _parse_fill_value(value) 2mhnhoh,eph-e.e. / : ; ocdc) 9bn * k l m g h i j ueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUe

614  

615 cdef size_t buffer_size = self._size 2mhnhoh,eph-e.e. / : ; ocdc) 9bn * k l m g h i j {ctd3cud4c|c5c}c~cad6c7c8c9c!c#cbdcd$c%cvd'c(cwd)cxdAcydBc*cCc+c,c-cDcEcFcGcHcIc.c/cJcKczdLcMcAd:cBdNcCdOc;cPc=c?c@cQcRcScTcUcVc[c]cWcXcDdYcZcEd

616 cdef cydriver.CUdeviceptr dst = as_cu(self._h_ptr) 2mhnhoh,eph-e.e. / : ; ocdc) 9bn * k l m g h i j {ctd3cud4c|c5c}c~cad6c7c8c9c!c#cbdcd$c%cvd'c(cwd)cxdAcydBc*cCc+c,c-cDcEcFcGcHcIc.c/cJcKczdLcMcAd:cBdNcCdOc;cPc=c?c@cQcRcScTcUcVc[c]cWcXcDdYcZcEd

617 cdef cydriver.CUstream s = as_cu(s_stream._h_stream) 2mhnhoh,eph-e.e. / : ; ocdc) 9bn * k l m g h i j {ctd3cud4c|c5c}c~cad6c7c8c9c!c#cbdcd$c%cvd'c(cwd)cxdAcydBc*cCc+c,c-cDcEcFcGcHcIc.c/cJcKczdLcMcAd:cBdNcCdOc;cPc=c?c@cQcRcScTcUcVc[c]cWcXcDdYcZcEd

618  

619 if elem_size == 1: 2mhnhoh,eph-e.e. / : ; ocdc) 9bn * k l m g h i j {ctd3cud4c|c5c}c~cad6c7c8c9c!c#cbdcd$c%cvd'c(cwd)cxdAcydBc*cCc+c,c-cDcEcFcGcHcIc.c/cJcKczdLcMcAd:cBdNcCdOc;cPc=c?c@cQcRcScTcUcVc[c]cWcXcDdYcZcEd

620 with nogil: 2mhnhoh,eph-e.e. / : ; ocdc) 9bn * k l m g h i j {c|c}c~cadbdcd)c*c+c,c-c.c/c:c;c=c?c@c[c]c

621 HANDLE_RETURN(cydriver.cuMemsetD8Async(dst, val, buffer_size, s)) 2mhnhoh,eph-e.e. / : ; ocdc) 9bn * k l m g h i j {c|c}c~cadbdcd)c*c+c,c-c.c/c:c;c=c?c@c[c]c

622 elif elem_size == 2: 

623 if buffer_size & 0x1: 2td3c6c7c8c$c%cvdxdAcDcEcFcJcKczdBdNcQcRcScWcXcDd

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

625 with nogil: 23c6c7c8c$c%cAcDcEcFcJcKcNcQcRcScWcXc

626 HANDLE_RETURN(cydriver.cuMemsetD16Async(dst, val, buffer_size // 2, s)) 23c6c7c8c$c%cAcDcEcFcJcKcNcQcRcScWcXc

627 elif elem_size == 4: 

628 if buffer_size & 0x3: 2ud4c5c9c!c#c'c(cwdydBcCcGcHcIcLcMcAdCdOcPcTcUcVcYcZcEd

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

630 with nogil: 24c5c9c!c#c'c(cBcCcGcHcIcLcMcOcPcTcUcVcYcZc

631 HANDLE_RETURN(cydriver.cuMemsetD32Async(dst, val, buffer_size // 4, s)) 24c5c9c!c#c'c(cBcCcGcHcIcLcMcOcPcTcUcVcYcZc

632  

633 def __dlpack__( 

634 self, 

635 *, 

636 stream: int | None = None, 

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

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

639 copy: bool | None = None, 

640 ) -> object: 

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

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

643 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 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbte2cge, ucd e f 8b

644 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 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbte2c, ucd e f 8b

645 raise BufferError("Sorry, not supported: dl_device other than None") 22c

646 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 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbte2c, ucd e f 8b

647 raise BufferError("Sorry, not supported: copy=True") 22c

648 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 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbte2c, ucd e f 8b

649 versioned = False 2te2c

650 else: 

651 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 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSb2c, ucd e f 8b

652 raise BufferError(f"Expected max_version tuple[int, int], got {max_version}") 22c

653 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 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSb2c, ucd e f 8b

654 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 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbte2c, ucd e f 8b

655  

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

657 Buffer_check_open(self) 2(eXe)e*b@bge, uc8b

658 return classify_dl_device(self) 2(eXe)e*b@b, uc8b

659  

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

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

662 # This raises a BufferError unless: 

663 # 1. Python is 3.12+ 

664 # 2. This Buffer object is host accessible 

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

666  

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

668 # Supporting method paired with __buffer__. 

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

670  

671 @property 

672 def device_id(self) -> int: 

673 """Return the device ordinal of this buffer, or -1 for memory not bound to a device.""" 

674 Buffer_check_open(self) 2}h~haiqereqcecXe2co p cc0c1c% ' (b)bge:g;gbicidi+ejekefe2ddded( hdidjd3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecekdldmdndodpdqd8b

675 if self._memory_resource is not None: 2}h~haiqereqcecXe2co p cc0c1c% ' (b)b:g;gbicidi+ejekefe2ddded( hdidjd3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecekdldmdndodpdqd8b

676 return self._memory_resource.device_id 2}h~haiqereXe2c:g;gbicidi+ejekefe2ddded3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebece8b

677 _init_memory_attrs(self) 2qceco p cc0c1c% ' (b)b( hdidjdkdldmdndodpdqd

678 return self._mem_attrs.device_id 2qceco p cc0c1c% ' (b)b( hdidjdkdldmdndodpdqd

679  

680 @property 

681 def handle(self) -> int: 

682 """Return the buffer handle object. 

683  

684 .. caution:: 

685  

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

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

688 """ 

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

690 # that expect a raw pointer value 

691 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 jhkhlhmhnhoh,ephqh-e.egirhshthW X Y Z 0 1 - . / : ; [b]b^b_b`b{b|b}h~hai=e?eagbg@ecg[e]edgegfggghgigjgkglgmgngogpgqgrgsgtgugvgwgxgygzg^eocdcAgoeBg2 3 4 ) 9b-b7 8 9 n ! * # .bk l m $ /b:b;b=bg !bXbh i j #bYbfc}bycZb5b$b%b0b1b~b=g1g?g2g@g3g[g4g5gpe6g^c]g7g^g8g'b9g_g!gacbc2b+ gchcicjckclc3b4bmcncTbUb6b7bVbWbqereCgDgHgGhIgqc/e/geca b c lemene5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbsehe`czcsd4ete2co p % ' )cAcBc*cCc+c,c-cDcEcFcGcHcIc.c/cJcKcLcMc:cNcOc;cPc=c?c@cQcRcScTcUcVc[c]cWcXcYcZcgdGdKd}f, ucHdbicidi0e~f1eLdId2eeefed e f fiOi~gFd2ddded( hdidjd3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecekd$eldmdndodpdqd8b

692  

693 @property 

694 def is_closed(self) -> bool: 

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

696 return self._h_ptr.get() == NULL 2~b=g?g@g[ggh^c]g^ghhih_gacbcieeefefi

697  

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

699 if not isinstance(other, Buffer): 2?e@e[e]eOi~gIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj0j1j2j3j4j5jGjPiQi

700 return NotImplemented 2OiIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj0j1j2j3j4j5j

701 cdef Buffer other_buf = <Buffer>other 2?e@e[e]eOi~gGjPiQi

702 return (as_intptr(self._h_ptr) == as_intptr(other_buf._h_ptr) and 2?e@e[e]eOi~gGjPiQi

703 self._size == other_buf._size) 2Oi~gPiQi

704  

705 def __hash__(self) -> int: 

706 return hash((as_intptr(self._h_ptr), self._size)) 2~g8j9j!j#j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}jPiQi

707  

708 def __repr__(self) -> str: 

709 maybe_is_mapped = " is_mapped=True" if self.is_mapped else "" 2=e^egchcbhch#g$g%g'gdheh(g)gicjckclc3b4bmcnc*g+g,g-gfiHj

710 return f"<Buffer ptr={as_intptr(self._h_ptr):#x} size={self._size}{maybe_is_mapped}>" 2=e^egchcbhch#g$g%g'gdheh(g)gicjckclc3b4bmcnc*g+g,g-gfiHj

711  

712 @property 

713 def is_device_accessible(self) -> bool: 

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

715 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 qceca b c 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbte(eXe)e*b@b2co p cc0c1c% ' (b)bgdge, ucrf+e8ed e f ( hdidjd3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecekdldmdndodpdqd8b

716 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 qceca b c 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbte(eXe)e*b@b2co p cc0c1c% ' (b)bgd, ucrf+e8ed e f ( hdidjd3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebecekdldmdndodpdqd8b

717 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 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbte(eXe)e*b@b2cgd, ucrf+e8ed e f 3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d}d~daebece8b

718 _init_memory_attrs(self) 2qceco p cc0c1c% ' (b)b( hdidjdkdldmdndodpdqd

719 return self._mem_attrs.is_device_accessible 2qceco p cc0c1c% ' (b)b( hdidjdkdldmdndodpdqd

720  

721 @property 

722 def is_host_accessible(self) -> bool: 

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

724 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 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbte(eXe)e*b@b2co p cc0c1c% ' (b)b{c3c4c|c5c}c~cad6c7c8c9c!c#cbdcd$c%c'c(c)cAcBc*cCc+c,c-cDcEcFcGcHcIc.c/cJcKcLcMc:cNcOc;cPc=c?c@cQcRcScTcUcVc[c]cWcXcYcZcgdgeYeZe, ucrf+e8ed e f ( 8b

725 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 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbte(eXe)e*b@b2co p cc0c1c% ' (b)b{c3c4c|c5c}c~cad6c7c8c9c!c#cbdcd$c%c'c(c)cAcBc*cCc+c,c-cDcEcFcGcHcIc.c/cJcKcLcMc:cNcOc;cPc=c?c@cQcRcScTcUcVc[c]cWcXcYcZcgdYeZe, ucrf+e8ed e f ( 8b

726 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 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbte(eXe)e*b@b2c{c3c4c|c5c}c~cad6c7c8c9c!c#cbdcd$c%c'c(c)cAcBc*cCc+c,c-cDcEcFcGcHcIc.c/cJcKcLcMc:cNcOc;cPc=c?c@cQcRcScTcUcVc[c]cWcXcYcZcgdYeZe, ucrf+e8ed e f 8b

727 _init_memory_attrs(self) 2o p cc0c1c% ' (b)b(

728 return self._mem_attrs.is_host_accessible 2o p cc0c1c% ' (b)b(

729  

730 @property 

731 def is_managed(self) -> bool: 

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

733 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 pc~b=g?g@g[gghHhIh^c]g^ghhih'bJh_gacbc2ba b c 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSb*b@bge, uc_cfdd e f

734 _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 pc~b=g?g@g[gghHhIh^c]g^ghhih'bJh_gacbc2ba b c 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSb*b@b, uc_cfdd e f

735 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 pc~b=g?g@g[gghHhIh^c]g^ghhih'bJh_gacbc2ba b c 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSb*b@b, uc_cfdd e f

736 return True 2pc~b=g?g@g[gghHhIh^c]g^ghhih'bJh_gacbc@b, uc

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

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

739 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 2ba b c 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSb*b_cfdd e f

740  

741 @property 

742 def is_mapped(self) -> bool: 

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

744 return getattr(self._ipc_data, "is_mapped", False) 2=e^egchcbhch#g$g%g'gdheh(g)gicjckclc3b4bmcnc*g+g,g-ggdfiHj

745  

746  

747 @property 

748 def memory_resource(self) -> MemoryResource: 

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

750 return self._memory_resource 2. / : ; [b]b^b_b`b{b|b) -b7 8 * # .b$ /b:b;b=buhvhwhxhyhzhAhBh+ gchcbhchCh6hDh7h#g8hEh9hFh!h$g#h%g'gdheh(g)gicjckclc3b4bmcnc*g+g,g-gTbUb6b7bVbWbqcecsehegdGdrfHdJg+eId8eLgjeke,f-fhdidjd3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e}d~d7eaebecekdldmdndodpdqd8b

751  

752 @property 

753 def size(self) -> int: 

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

755 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~hai2 3 4 ) 9b-b7 8 9 n ! * # Bi.bk l m $ /b:b;b=bCiDiEi+b,bg !bXbh i j #bYbfc}bycZb5b$b%b0b1b~b=g1g?g2g@g3g[g4g5gpe6g^c]g7g^g8g'b9g_g!gacbc2buhvhwhxhyhzhAhBh+ gchcbhchCh6hDh7h#g8hEh9hFh!h$g#h%g'gdheh(g)gicjckclc3b4bmcnc*g+g,g-gTbUb6b7bVbWbqereHgIgqc/e.ga b c lemene5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSbsd4ete2cgd:g;gGd}f, ucrfHdbicidi+eId8e2ejekeeefed e f ~g,f-fFdMdNdOdPdQdRdSdTd2ddded3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e}d~d7eaebece8b

756  

757 @property 

758 def owner(self) -> object: 

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

760 return self._owner 2cc

761  

762  

763cdef class MemoryResource: 

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

765 deallocation of buffers. 

766  

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

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

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

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

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

772 resource's respective property.) 

773 """ 

774  

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

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

777  

778 Parameters 

779 ---------- 

780 size : int 

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

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

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

784 asynchronously. Must be passed explicitly; pass 

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

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

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

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

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

790 each thread. 

791  

792 Returns 

793 ------- 

794 Buffer 

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

796 depending on the resource's properties. 

797 """ 

798 raise TypeError("MemoryResource.allocate must be implemented by subclasses.") 2Ri

799  

800 def deallocate( 

801 self, 

802 ptr: DevicePointerType, 

803 size_t size, 

804 *, 

805 stream: Stream | GraphBuilder 

806 ) -> None: 

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

808  

809 Parameters 

810 ---------- 

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

812 The pointer or handle to the buffer to deallocate. 

813 size : int 

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

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

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

817 asynchronously. Must be passed explicitly; pass 

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

819 """ 

820 raise TypeError("MemoryResource.deallocate must be implemented by subclasses.") 2Ri

821  

822 @property 

823 def is_device_accessible(self) -> bool: 

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

825 raise TypeError("MemoryResource.is_device_accessible must be implemented by subclasses.") 2Ri

826  

827 @property 

828 def is_host_accessible(self) -> bool: 

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

830 raise TypeError("MemoryResource.is_host_accessible must be implemented by subclasses.") 2Ri

831  

832 @property 

833 def is_managed(self) -> bool: 

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

835 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 5 6 = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbLbMbNbObPbQbRbSb*b_cfdd e f

836  

837 @property 

838 def device_id(self) -> int: 

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

840 raise TypeError("MemoryResource.device_id must be implemented by subclasses.") 2Ri

841  

842  

843# Buffer Implementation Helpers 

844# ----------------------------- 

845cdef Buffer Buffer_from_deviceptr_handle( 

846 DevicePtrHandle h_ptr, 

847 size_t size, 

848 MemoryResource mr, 

849 object ipc_descriptor = None, 

850 type cls = Buffer, 

851): 

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

853 cdef Buffer buf = cls.__new__(cls) 2jhkhlhmhnhKhhiiioh,ephqh-e.egirhshLhthMhNhOhjikili. / : ; [b]b^b_b`b{b|b}h~hai]f^f_focdc`f{f|f_e`e{e7 8 9 |en }e! ~eafbfcf# dfefk l m $ ffgfhfifjfkflfmfnfofpfqf+b,bg h i j pc~bPhmi^cnioiacbc:e;e`g{g|guhvhwhxhyhzhAhBh+ gchcbhchCh6hDh7h#g8hEh9hFh!h$g#h%g'gdheh(g)gicjckclc3b4bmcnc*g+g,g-gTbUb6b7bVbWbqereQhHgGh}gIgRhqc/e.g/geca b c o p :g;gGducrfHdbicidiShThUhVhWhXhYhZh0h1h2h3h4hJg_cfd+eId8eLg5hd e f sftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[fFdMdNdXdOdPdQdRdYdZd0dSd1dTddded( 3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebece$e8b

854 buf._h_ptr = h_ptr 2jhkhlhmhnhKhhiiioh,ephqh-e.egirhshLhthMhNhOhjikili. / : ; [b]b^b_b`b{b|b}h~hai]f^f_focdc`f{f|f_e`e{e7 8 9 |en }e! ~eafbfcf# dfefk l m $ ffgfhfifjfkflfmfnfofpfqf+b,bg h i j pc~bPhmi^cnioiacbc:e;e`g{g|guhvhwhxhyhzhAhBh+ gchcbhchCh6hDh7h#g8hEh9hFh!h$g#h%g'gdheh(g)gicjckclc3b4bmcnc*g+g,g-gTbUb6b7bVbWbqereQhHgGh}gIgRhqc/e.g/geca b c o p :g;gGducrfHdbicidiShThUhVhWhXhYhZh0h1h2h3h4hJg_cfd+eId8eLg5hd e f sftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[fFdMdNdXdOdPdQdRdYdZd0dSd1dTddded( 3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebece$e8b

855 buf._size = size 2jhkhlhmhnhKhhiiioh,ephqh-e.egirhshLhthMhNhOhjikili. / : ; [b]b^b_b`b{b|b}h~hai]f^f_focdc`f{f|f_e`e{e7 8 9 |en }e! ~eafbfcf# dfefk l m $ ffgfhfifjfkflfmfnfofpfqf+b,bg h i j pc~bPhmi^cnioiacbc:e;e`g{g|guhvhwhxhyhzhAhBh+ gchcbhchCh6hDh7h#g8hEh9hFh!h$g#h%g'gdheh(g)gicjckclc3b4bmcnc*g+g,g-gTbUb6b7bVbWbqereQhHgGh}gIgRhqc/e.g/geca b c o p :g;gGducrfHdbicidiShThUhVhWhXhYhZh0h1h2h3h4hJg_cfd+eId8eLg5hd e f sftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[fFdMdNdXdOdPdQdRdYdZd0dSd1dTddded( 3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebece$e8b

856 buf._memory_resource = mr 2jhkhlhmhnhKhhiiioh,ephqh-e.egirhshLhthMhNhOhjikili. / : ; [b]b^b_b`b{b|b}h~hai]f^f_focdc`f{f|f_e`e{e7 8 9 |en }e! ~eafbfcf# dfefk l m $ ffgfhfifjfkflfmfnfofpfqf+b,bg h i j pc~bPhmi^cnioiacbc:e;e`g{g|guhvhwhxhyhzhAhBh+ gchcbhchCh6hDh7h#g8hEh9hFh!h$g#h%g'gdheh(g)gicjckclc3b4bmcnc*g+g,g-gTbUb6b7bVbWbqereQhHgGh}gIgRhqc/e.g/geca b c o p :g;gGducrfHdbicidiShThUhVhWhXhYhZh0h1h2h3h4hJg_cfd+eId8eLg5hd e f sftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[fFdMdNdXdOdPdQdRdYdZd0dSd1dTddded( 3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebece$e8b

857 buf._ipc_data = IPCDataForBuffer(ipc_descriptor, True) if ipc_descriptor is not None else None 2jhkhlhmhnhKhhiiioh,ephqh-e.egirhshLhthMhNhOhjikili. / : ; [b]b^b_b`b{b|b}h~hai]f^f_focdc`f{f|f_e`e{e7 8 9 |en }e! ~eafbfcf# dfefk l m $ ffgfhfifjfkflfmfnfofpfqf+b,bg h i j pc~bPhmi^cnioiacbc:e;e`g{g|guhvhwhxhyhzhAhBh+ gchcbhchCh6hDh7h#g8hEh9hFh!h$g#h%g'gdheh(g)gicjckclc3b4bmcnc*g+g,g-gTbUb6b7bVbWbqereQhHgGh}gIgRhqc/e.g/geca b c o p :g;gGducrfHdbicidiShThUhVhWhXhYhZh0h1h2h3h4hJg_cfd+eId8eLg5hd e f sftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[fFdMdNdXdOdPdQdRdYdZd0dSd1dTddded( 3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebece$e8b

858 buf._owner = None 2jhkhlhmhnhKhhiiioh,ephqh-e.egirhshLhthMhNhOhjikili. / : ; [b]b^b_b`b{b|b}h~hai]f^f_focdc`f{f|f_e`e{e7 8 9 |en }e! ~eafbfcf# dfefk l m $ ffgfhfifjfkflfmfnfofpfqf+b,bg h i j pc~bPhmi^cnioiacbc:e;e`g{g|guhvhwhxhyhzhAhBh+ gchcbhchCh6hDh7h#g8hEh9hFh!h$g#h%g'gdheh(g)gicjckclc3b4bmcnc*g+g,g-gTbUb6b7bVbWbqereQhHgGh}gIgRhqc/e.g/geca b c o p :g;gGducrfHdbicidiShThUhVhWhXhYhZh0h1h2h3h4hJg_cfd+eId8eLg5hd e f sftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[fFdMdNdXdOdPdQdRdYdZd0dSd1dTddded( 3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebece$e8b

859 buf._mem_attrs_inited.store(False) 2jhkhlhmhnhKhhiiioh,ephqh-e.egirhshLhthMhNhOhjikili. / : ; [b]b^b_b`b{b|b}h~hai]f^f_focdc`f{f|f_e`e{e7 8 9 |en }e! ~eafbfcf# dfefk l m $ ffgfhfifjfkflfmfnfofpfqf+b,bg h i j pc~bPhmi^cnioiacbc:e;e`g{g|guhvhwhxhyhzhAhBh+ gchcbhchCh6hDh7h#g8hEh9hFh!h$g#h%g'gdheh(g)gicjckclc3b4bmcnc*g+g,g-gTbUb6b7bVbWbqereQhHgGh}gIgRhqc/e.g/geca b c o p :g;gGducrfHdbicidiShThUhVhWhXhYhZh0h1h2h3h4hJg_cfd+eId8eLg5hd e f sftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[fFdMdNdXdOdPdQdRdYdZd0dSd1dTddded( 3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebece$e8b

860 return buf 2jhkhlhmhnhKhhiiioh,ephqh-e.egirhshLhthMhNhOhjikili. / : ; [b]b^b_b`b{b|b}h~hai]f^f_focdc`f{f|f_e`e{e7 8 9 |en }e! ~eafbfcf# dfefk l m $ ffgfhfifjfkflfmfnfofpfqf+b,bg h i j pc~bPhmi^cnioiacbc:e;e`g{g|guhvhwhxhyhzhAhBh+ gchcbhchCh6hDh7h#g8hEh9hFh!h$g#h%g'gdheh(g)gicjckclc3b4bmcnc*g+g,g-gTbUb6b7bVbWbqereQhHgGh}gIgRhqc/e.g/geca b c o p :g;gGducrfHdbicidiShThUhVhWhXhYhZh0h1h2h3h4hJg_cfd+eId8eLg5hd e f sftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!f#f$f%f'f(f)f*f+f,f-f.f/f:f;f=f?f@f[fFdMdNdXdOdPdQdRdYdZd0dSd1dTddded( 3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`d{d|d6e%e'e}d~d7eaebece$e8b

861  

862  

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

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

865  

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

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

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

869 """ 

870 cdef list out 

871 if isinstance(buffers, Buffer): 2) 9b-b7 8 9 n ! KiLi* # Bi.bk l m $ /b:b;b=bMiCiDiEiFiGiziAi+b,bpc~bacbc:e;e`g{g|g

872 raise TypeError( 2Ai`g{g|g

873 f"{what}: pass a sequence of Buffers; for a single buffer use {single_hint}" 2Ai`g{g|g

874 ) 

875 if not isinstance(buffers, Sequence): 2) 9b-b7 8 9 n ! KiLi* # Bi.bk l m $ /b:b;b=bMiCiDiEiFiGiziAi+b,bpc~bacbc:e;e

876 raise TypeError( 2zi

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

878 ) 

879 if not buffers: 2) 9b-b7 8 9 n ! KiLi* # Bi.bk l m $ /b:b;b=bMiCiDiEiFiGiziAi+b,bpc~bacbc:e;e

880 raise ValueError(f"{what}: empty buffers sequence") 2Fi

881 out = [] 2) 9b-b7 8 9 n ! KiLi* # Bi.bk l m $ /b:b;b=bMiCiDiEiFiGiziAi+b,bpc~bacbc:e;e

882 for item in buffers: 2) 9b-b7 8 9 n ! KiLi* # Bi.bk l m $ /b:b;b=bMiCiDiEiFiGiziAi+b,bpc~bacbc:e;e

883 if not isinstance(item, Buffer): 2) 9b-b7 8 9 n ! KiLi* # Bi.bk l m $ /b:b;b=bMiCiDiEiFiGiziAi+b,bpc~bacbc:e;e

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

885 Buffer_check_open(<Buffer>item) 2) 9b-b7 8 9 n ! KiLi* # Bi.bk l m $ /b:b;b=bMiCiDiEiFiGiziAi+b,bpc~bacbc:e;e

886 out.append(item) 2) 9b-b7 8 9 n ! KiLi* # Bi.bk l m $ /b:b;b=bMiCiDiEiFiGiziAi+b,bpc~bacbc:e;e

887 return tuple(out) 2) 9b-b7 8 9 n ! KiLi* # Bi.bk l m $ /b:b;b=bMiCiDiEiFiGiziAi+b,bpc~bacbc:e;e

888  

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

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

891 Buffer_check_open(self) 2]f^f_f`f{f|f$h9b%h'h7 8 9 (hn )h! *h+h,h-h# .h/hk l m $ :h;h=h?h@h[h]h^h_h`h{h|h+b,bg !bXbh i j #bYbfc}bZb$b%b0b1b/eUdsd4eVdieGdKdHdWdLdIdWede

892 cdef Stream s = Stream_accept(stream) 2]f^f_f`f{f|f$h9b%h'h7 8 9 (hn )h! *h+h,h-h# .h/hk l m $ :h;h=h?h@h[h]h^h_h`h{h|h+b,bg !bXbh i j #bYbfc}bZb$b%b0b1b/eUdsd4eVdieGdKdHdWdLdIdWede

893 _apply_deallocation_stream(self._h_ptr, s._h_stream) 2]f^f_f`f{f|f$h9b%h'h7 8 9 (hn )h! *h+h,h-h# .h/hk l m $ :h;h=h?h@h[h]h^h_h`h{h|h+b,bg !bXbh i j #bYbfc}bZb$b%b0b1b/eUdsd4eVdGdKdHdWdLdIdde

894  

895  

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

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

898 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 jhkh9elhKh,eqh-e.erhshLhthW X Y Z 0 1 MhNhOh. / : ; [b]b^b_b`b{b|b]f^f_foe2 3 4 `f{f|f) $h9b%h-b'h7 8 9 (hn )h! *h+h,h* -h# .h.b/hk l m $ /b:h:b;h;b=h=b?h@h[h]h^h_h`h{h|h+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1bpc~bpiqirisitiPhpeuiHi^cviIiwiJi'bxiyiacbc:e;e`g{g|g2b+ 3b4bTbUb6b7bVbWbQhHgGh}gIgRhqc/e.g/gec!e5 6 seheJd`crdzcUd3esdo p cc% ' (b)bueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdgeie*e:g;gGdKdYeZe5e#erfHdShThUhVhWhXhYhZh0h1h2h3h4hJg0eWdVe1eLd_cfdKg+eId8eLg5hWe2edejekeeefefi,f-fFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded8b

899 return 2fi

900 # Update deallocation stream if provided 

901 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 jhkh9elhKh,eqh-e.erhshLhthW X Y Z 0 1 MhNhOh. / : ; [b]b^b_b`b{b|b]f^f_foe2 3 4 `f{f|f) $h9b%h-b'h7 8 9 (hn )h! *h+h,h* -h# .h.b/hk l m $ /b:h:b;h;b=h=b?h@h[h]h^h_h`h{h|h+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1bpc~bpiqirisitiPhpeuiHi^cviIiwiJi'bxiyiacbc:e;e`g{g|g2b+ 3b4bTbUb6b7bVbWbQhHgGh}gIgRhqc/e.g/gec!e5 6 seheJd`crdzcUd3esdo p cc% ' (b)bueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdgeie*e:g;gGdKdYeZe5e#erfHdShThUhVhWhXhYhZh0h1h2h3h4hJg0eWdVe1eLd_cfdKg+eId8eLg5hWe2edejekeeefefi,f-fFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded8b

902 Buffer_set_deallocation_stream(self, stream) 2]f^f_f`f{f|f$h9b%h'h7 8 9 (hn )h! *h+h,h-h# .h/hk l m $ :h;h=h?h@h[h]h^h_h`h{h|h+b,bg !bXbh i j #bYbfc}bZb$b%b0b1b/eUdVdieGdKdHdWdLdIdde

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

904 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 jhkh9elhKh,eqh-e.erhshLhthW X Y Z 0 1 MhNhOh. / : ; [b]b^b_b`b{b|b]f^f_foe2 3 4 `f{f|f) $h9b%h-b'h7 8 9 (hn )h! *h+h,h* -h# .h.b/hk l m $ /b:h:b;h;b=h=b?h@h[h]h^h_h`h{h|h+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1bpc~bpiqirisitiPhpeuiHi^cviIiwiJi'bxiyiacbc:e;e`g{g|g2b+ 3b4bTbUb6b7bVbWbQhHgGh}gIgRhqc/e.g/gec!e5 6 seheJd`crdzcUd3esdo p cc% ' (b)bueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdgeie*e:g;gGdKdYeZe5e#erfHdShThUhVhWhXhYhZh0h1h2h3h4hJg0eWdVe1eLd_cfdKg+eId8eLg5hWe2edejekeeefefi,f-fFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded8b

905 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 jhkh9elhKh,eqh-e.erhshLhthW X Y Z 0 1 MhNhOh. / : ; [b]b^b_b`b{b|b]f^f_foe2 3 4 `f{f|f) $h9b%h-b'h7 8 9 (hn )h! *h+h,h* -h# .h.b/hk l m $ /b:h:b;h;b=h=b?h@h[h]h^h_h`h{h|h+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1bpc~bpiqirisitiPhpeuiHi^cviIiwiJi'bxiyiacbc:e;e`g{g|g2b+ 3b4bTbUb6b7bVbWbQhHgGh}gIgRhqc/e.g/gec!e5 6 seheJd`crdzcUd3esdo p cc% ' (b)bueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdgeie*e:g;gGdKdYeZe5e#erfHdShThUhVhWhXhYhZh0h1h2h3h4hJg0eWdVe1eLd_cfdKg+eId8eLg5hWe2edejekeeefefi,f-fFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded8b

906 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 jhkh9elhKh,eqh-e.erhshLhthW X Y Z 0 1 MhNhOh. / : ; [b]b^b_b`b{b|b]f^f_foe2 3 4 `f{f|f) $h9b%h-b'h7 8 9 (hn )h! *h+h,h* -h# .h.b/hk l m $ /b:h:b;h;b=h=b?h@h[h]h^h_h`h{h|h+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1bpc~bpiqirisitiPhpeuiHi^cviIiwiJi'bxiyiacbc:e;e`g{g|g2b+ 3b4bTbUb6b7bVbWbQhHgGh}gIgRhqc/e.g/gec!e5 6 seheJd`crdzcUd3esdo p cc% ' (b)bueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdgeie*e:g;gGdKdYeZe5e#erfHdShThUhVhWhXhYhZh0h1h2h3h4hJg0eWdVe1eLd_cfdKg+eId8eLg5hWe2edejekeeefefi,f-fFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded8b

907 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 jhkh9elhKh,eqh-e.erhshLhthW X Y Z 0 1 MhNhOh. / : ; [b]b^b_b`b{b|b]f^f_foe2 3 4 `f{f|f) $h9b%h-b'h7 8 9 (hn )h! *h+h,h* -h# .h.b/hk l m $ /b:h:b;h;b=h=b?h@h[h]h^h_h`h{h|h+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1bpc~bpiqirisitiPhpeuiHi^cviIiwiJi'bxiyiacbc:e;e`g{g|g2b+ 3b4bTbUb6b7bVbWbQhHgGh}gIgRhqc/e.g/gec!e5 6 seheJd`crdzcUd3esdo p cc% ' (b)bueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdgeie*e:g;gGdKdYeZe5e#erfHdShThUhVhWhXhYhZh0h1h2h3h4hJg0eWdVe1eLd_cfdKg+eId8eLg5hWe2edejekeeefefi,f-fFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded8b

908 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 jhkh9elhKh,eqh-e.erhshLhthW X Y Z 0 1 MhNhOh. / : ; [b]b^b_b`b{b|b]f^f_foe2 3 4 `f{f|f) $h9b%h-b'h7 8 9 (hn )h! *h+h,h* -h# .h.b/hk l m $ /b:h:b;h;b=h=b?h@h[h]h^h_h`h{h|h+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1bpc~bpiqirisitiPhpeuiHi^cviIiwiJi'bxiyiacbc:e;e`g{g|g2b+ 3b4bTbUb6b7bVbWbQhHgGh}gIgRhqc/e.g/gec!e5 6 seheJd`crdzcUd3esdo p cc% ' (b)bueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdgeie*e:g;gGdKdYeZe5e#erfHdShThUhVhWhXhYhZh0h1h2h3h4hJg0eWdVe1eLd_cfdKg+eId8eLg5hWe2edejekeeefefi,f-fFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded8b

909 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 jhkh9elhKh,eqh-e.erhshLhthW X Y Z 0 1 MhNhOh. / : ; [b]b^b_b`b{b|b]f^f_foe2 3 4 `f{f|f) $h9b%h-b'h7 8 9 (hn )h! *h+h,h* -h# .h.b/hk l m $ /b:h:b;h;b=h=b?h@h[h]h^h_h`h{h|h+b,brcsctcg !bXbh i ?bj #bxcYbwcfc}bycZb5b$b%b0b1bpc~bpiqirisitiPhpeuiHi^cviIiwiJi'bxiyiacbc:e;e`g{g|g2b+ 3b4bTbUb6b7bVbWbQhHgGh}gIgRhqc/e.g/gec!e5 6 seheJd`crdzcUd3esdo p cc% ' (b)bueve{ctd3cweud4c|cxeyeze5cAe}c~cad6c7c8c9c!c#cBebdcd$c%cvd'c(cwdCeDeEe)cxdAcFeydBc*cGeHeIeCcJe+c,c-cDcEcFcGcHcIcKe.c/cJcKczdLcMcAdLeMeNe:cBdNcOeCdOc;cPeQeRePcSe=c?c@cQcRcScTcUcVcTe[c]cWcXcDdYcZcEdUegdVdgeie*e:g;gGdKdYeZe5e#erfHdShThUhVhWhXhYhZh0h1h2h3h4hJg0eWdVe1eLd_cfdKg+eId8eLg5hWe2edejekeeefefi,f-fFdMdNdXdOdPdQdRdYdZd0dSd1dTd2ddded8b