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
« 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
5from __future__ import annotations
7cimport cython
8from libc.stdint cimport uintptr_t
9from libcpp.atomic cimport memory_order_acquire, memory_order_release
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
30from cuda.core._memory._copy_attributes cimport _with_attributes_available
31from cuda.core._memory._copy_attributes cimport _to_cu_memcpy_attributes # no-cython-lint
33IF CUDA_CORE_BUILD_MAJOR >= 13:
34 from cuda.core._resource_handles cimport memcpy_with_attributes_async
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
39import sys
40from collections.abc import Sequence
41from typing import TYPE_CHECKING
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
48if TYPE_CHECKING:
49 from cuda.core.graph import GraphBuilder
52# =============================================================================
53# MR deallocation callback (invoked from C++ shared_ptr deleter)
54# =============================================================================
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
77register_mr_dealloc_callback(_mr_dealloc_callback)
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.
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
97__all__ = ['Buffer', 'MemoryResource']
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 ]
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
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
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
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
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
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
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)))
234cdef class Buffer:
235 """Represent a handle to allocated memory.
237 This generic object provides a unified representation for how
238 different memory resources are to give access to their memory
239 allocations.
241 Support for data interchange mechanisms are provided by DLPack.
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
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
261 def __init__(self, *args, **kwargs) -> None:
262 raise RuntimeError("Buffer objects cannot be instantiated directly. " 2Ni
263 "Please use MemoryResource APIs.")
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.
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
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())
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
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.
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.
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
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.
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.
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
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
422 def close(self, stream: Stream | GraphBuilder | None = None) -> None:
423 """Deallocate this buffer asynchronously on the given stream.
425 This buffer is released back to their memory resource
426 asynchronously on the given stream.
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.
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
441 def set_deallocation_stream(self, stream: Stream | GraphBuilder) -> None:
442 """Change the stream that orders this buffer's eventual deallocation.
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.
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``.
452 Parameters
453 ----------
454 stream : :obj:`~_stream.Stream` | :obj:`~graph.GraphBuilder`
455 The stream to use for eventual asynchronous deallocation.
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.
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
472 def __enter__(self):
473 return self 2oe+ Hg}gIg.g/geche2d
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
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.
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.
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.
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.
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
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
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
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.
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.
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
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")
587 def fill(self, value: int | BufferProtocol, *, stream: Stream | GraphBuilder) -> None:
588 """Fill this buffer with a repeating byte pattern.
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.
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).
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
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
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
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
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
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.")
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.")
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
680 @property
681 def handle(self) -> int:
682 """Return the buffer handle object.
684 .. caution::
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
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
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
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
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
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
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(
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
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
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
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
757 @property
758 def owner(self) -> object:
759 """Return the object holding external allocation."""
760 return self._owner 2cc
763cdef class MemoryResource:
764 """Abstract base class for memory resources that manage allocation and
765 deallocation of buffers.
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 """
775 def allocate(self, size_t size, *, stream: Stream | GraphBuilder) -> Buffer:
776 """Allocate a buffer of the requested size.
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.
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
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.
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
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
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
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
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
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
863cdef tuple Buffer_coerce_batch(object buffers, str what, str single_hint):
864 """Coerce ``buffers`` to a ``tuple[Buffer, ...]``; reject a bare Buffer.
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
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
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