Coverage for cuda/core/_memory/_buffer.pyx: 91.18%
306 statements
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-03 02:41 +0000
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-03 02:41 +0000
1# SPDX-FileCopyrightText: Copyright (c) 2024-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2#
3# SPDX-License-Identifier: Apache-2.0
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 W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' OhUbPh6bQh5 6 7 Rhn Sh8 ThUhVh( Wh9 Xh7bYhk l m ! 8bZh9b0h!b1h#b2h3h4h5h6h7h8h9h!h1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb@h[h]h^h_h{d`h{h|hZb}h~hMbrisitiuiviwixiyiziAiBiCiDiDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p # $ ~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFd@dtd1g+gKeQeAg2gBg3g)f) Fe*fGdAeGeudBeHe:d[d]d;d=dd e f *hEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4i5i6i7i8i9i!i#i$i%i'i(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/dRe
65 if not h_stream: 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' OhUbPh6bQh5 6 7 Rhn Sh8 ThUhVh( Wh9 Xh7bYhk l m ! 8bZh9b0h!b1h#b2h3h4h5h6h7h8h9h!h1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb@h[h]h^h_h{d`h{h|hZb}h~hMbrisitiuiviwixiyiziAiBiCiDiDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p # $ ~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFd@dtd1g+gKeQeAg2gBg3g)f) Fe*fGdAeGeudBeHe:d[d]d;d=dd e f *hEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4i5i6i7i8i9i!i#i$i%i'i(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/dRe
66 print( 21g+g
67 "Warning: no deallocation stream was recorded; falling back to "
68 "the default stream for mr.deallocate() during Buffer "
69 "destruction. This is an internal cuda-core error; please "
70 "report it with your CUDA driver, CUDA Toolkit, and "
71 "cuda-python versions.",
72 file=sys.stderr, 21g+g
73 )
74 stream = default_stream() 21g+g
75 else:
76 stream = Stream._from_handle(Stream, h_stream) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' OhUbPh6bQh5 6 7 Rhn Sh8 ThUhVh( Wh9 Xh7bYhk l m ! 8bZh9b0h!b1h#b2h3h4h5h6h7h8h9h!h1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb@h[h]h^h_h{d`h{h|hZb}h~hMbrisitiuiviwixiyiziAiBiCiDiDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p # $ ~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFd@dtdKeQeAg2gBg3g)f) Fe*fGdAeGeudBeHe:d[d]d;d=dd e f *hEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4i5i6i7i8i9i!i#i$i%i'i(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/dRe
77 mr.deallocate(int(ptr), size, stream=stream) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' OhUbPh6bQh5 6 7 Rhn Sh8 ThUhVh( Wh9 Xh7bYhk l m ! 8bZh9b0h!b1h#b2h3h4h5h6h7h8h9h!h1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb@h[h]h^h_h{d`h{h|hZb}h~hMbrisitiuiviwixiyiziAiBiCiDiDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p # $ ~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFd@dtd1g+gKeQeAg2gBg3g)f) Fe*fGdAeGeudBeHe:d[d]d;d=dd e f *hEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4i5i6i7i8i9i!i#i$i%i'i(i)i*i+i,i-i.i/i:i;i=i?i@i[i]i^i_i`i{i|i}i~iajbjpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/dRe
78 except Exception as exc: 2@bAe;d
79 print(f"Warning: mr.deallocate() failed during Buffer destruction: {exc}", 2Ae;d
80 file=sys.stderr) 2Ae;d
82register_mr_dealloc_callback(_mr_dealloc_callback)
85cdef inline void _apply_deallocation_stream(
86 const DevicePtrHandle& h_ptr, const StreamHandle& h_stream) except *:
87 """Record h_stream as the deallocation stream for h_ptr.
89 Translates CUDA_ERROR_INVALID_CONTEXT (default-stream token with no current
90 context) into a descriptive RuntimeError instead of a raw CUDAError.
91 """
92 cdef cydriver.CUresult status = set_deallocation_stream(h_ptr, h_stream) 24e5e6e7e8e9eOhUbPhQh5 6 7 Rhn Sh8 ThUhVhWh9 XhYhk l m ! Zh0h1h2h3h4h5h6h7h8h9h!h1b2bg VbHbh i j WbIb[b:bJbXbYbKbLbYeEdcdJeFd|ctd}cGdud~c:d
93 if status == cydriver.CUresult.CUDA_ERROR_INVALID_CONTEXT: 24e5e6e7e8e9eOhUbPhQh5 6 7 Rhn Sh8 ThUhVhWh9 XhYhk l m ! Zh0h1h2h3h4h5h6h7h8h9h!h1b2bg VbHbh i j WbIb[b:bJbXbYbKbLbYeEdcdJeFd|ctd}cGdud~c:d
94 raise RuntimeError( 2Fd
95 "Cannot record a default deallocation stream when no CUDA context is "
96 "current. Call Device.set_current() first, or pass stream= with a "
97 "non-default Stream."
98 )
99 HANDLE_RETURN(status) 24e5e6e7e8e9eOhUbPhQh5 6 7 Rhn Sh8 ThUhVhWh9 XhYhk l m ! Zh0h1h2h3h4h5h6h7h8h9h!h1b2bg VbHbh i j WbIb[b:bJbXbYbKbLbYeEdcdJe|ctd}cGdud~c:d
102__all__ = ['Buffer', 'MemoryResource']
105# Memory Attribute Query Helpers
106# ------------------------------
107cdef inline int _query_memory_attrs(
108 _MemAttrs& out,
109 cydriver.CUdeviceptr ptr
110) except -1 nogil:
111 """Query memory attributes for a device pointer."""
112 cdef unsigned int memory_type = 0 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bo p (bfcgc# $ NbOb) ]bjcNcd e f % ;c=c?c@c[c]c^c_c`c{c
113 cdef int is_managed = 0 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bo p (bfcgc# $ NbOb) ]bjcNcd e f % ;c=c?c@c[c]c^c_c`c{c
114 cdef int device_id = 0 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bo p (bfcgc# $ NbOb) ]bjcNcd e f % ;c=c?c@c[c]c^c_c`c{c
115 cdef cydriver.CUpointer_attribute[3] attrs = [ 2@bq r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bo p (bfcgc# $ NbOb) ]bjcNcd e f % ;c=c?c@c[c]c^c_c`c{c
116 cydriver.CUpointer_attribute.CU_POINTER_ATTRIBUTE_MEMORY_TYPE,
117 cydriver.CUpointer_attribute.CU_POINTER_ATTRIBUTE_IS_MANAGED,
118 cydriver.CUpointer_attribute.CU_POINTER_ATTRIBUTE_DEVICE_ORDINAL,
119 ]
120 cdef uintptr_t[3] vals = [ 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bo p (bfcgc# $ NbOb) ]bjcNcd e f % ;c=c?c@c[c]c^c_c`c{c
121 <uintptr_t><void*>&memory_type,
122 <uintptr_t><void*>&is_managed,
123 <uintptr_t><void*>&device_id,
124 ]
126 cdef cydriver.CUresult ret
127 ret = cydriver.cuPointerGetAttributes(3, attrs, <void**>vals, ptr) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bo p (bfcgc# $ NbOb) ]bjcNcd e f % ;c=c?c@c[c]c^c_c`c{c
128 if ret == cydriver.CUresult.CUDA_ERROR_NOT_INITIALIZED: 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bo p (bfcgc# $ NbOb) ]bjcNcd e f % ;c=c?c@c[c]c^c_c`c{c
129 with cython.gil:
130 # Device class handles the cuInit call internally
131 Device()
132 ret = cydriver.cuPointerGetAttributes(3, attrs, <void**>vals, ptr)
133 HANDLE_RETURN(ret) 2@bq r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bo p (bfcgc# $ NbOb) ]bjcNcd e f % ;c=c?c@c[c]c^c_c`c{c
135 # TODO: HMM/ATS-enabled sysmem should also report is_managed=True; the
136 # CU_POINTER_ATTRIBUTE_IS_MANAGED query does not capture that yet.
137 out.is_managed = is_managed != 0 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bo p (bfcgc# $ NbOb) ]bjcNcd e f % ;c=c?c@c[c]c^c_c`c{c
139 if memory_type == 0: 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bo p (bfcgc# $ NbOb) ]bjcNcd e f % ;c=c?c@c[c]c^c_c`c{c
140 # unregistered host pointer
141 out.is_host_accessible = True 2(bNbOb;c=c?c@c[c]c^c_c`c{c
142 out.is_device_accessible = False 2(bNbOb;c=c?c@c[c]c^c_c`c{c
143 out.device_id = -1 2(bNbOb;c=c?c@c[c]c^c_c`c{c
144 elif ( 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bo p fcgc# $ NbOb) ]bjcNcd e f %
145 is_managed 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bo p fcgc# $ NbOb) ]bjcNcd e f %
146 or memory_type == cydriver.CUmemorytype.CU_MEMORYTYPE_HOST 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 Mb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0bo p # $ NbObjcNcd e f %
147 ):
148 # Managed memory or pinned host memory
149 out.is_host_accessible = True 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bfcgc# $ NbOb) ]bNcd e f
150 out.is_device_accessible = True 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bfcgc# $ NbOb) ]bNcd e f
151 out.device_id = device_id 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bfcgc# $ NbOb) ]bNcd e f
152 elif memory_type == cydriver.CUmemorytype.CU_MEMORYTYPE_DEVICE: 2Mb?b'bo p jc%
153 out.is_host_accessible = False 2Mb?b'bo p jc%
154 out.is_device_accessible = True 2Mb?b'bo p jc%
155 out.device_id = device_id 2Mb?b'bo p jc%
156 else:
157 with cython.gil:
158 raise ValueError(f"Unsupported memory type: {memory_type}")
159 return 0 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bo p (bfcgc# $ NbOb) ]bjcNcd e f % ;c=c?c@c[c]c^c_c`c{c
162cdef inline void _init_memory_attrs(Buffer self):
163 """Initialize memory attributes by querying the pointer."""
164 Buffer_check_open(self) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bo p (bfcgc# $ NbOb) ]bjcNcd e f % ;c=c?c@c[c]c^c_c`c{c
165 if not self._mem_attrs_inited.load(memory_order_acquire): 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bo p (bfcgc# $ NbOb) ]bjcNcd e f % ;c=c?c@c[c]c^c_c`c{c
166 _query_memory_attrs(self._mem_attrs, as_cu(self._h_ptr)) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bo p (bfcgc# $ NbOb) ]bjcNcd e f % ;c=c?c@c[c]c^c_c`c{c
167 self._mem_attrs_inited.store(True, memory_order_release) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMb?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bo p (bfcgc# $ NbOb) ]bjcNcd e f % ;c=c?c@c[c]c^c_c`c{c
170cdef bint _stream_is_capturing(Stream s):
171 cdef cydriver.CUstreamCaptureStatus cap_status
172 IF CUDA_CORE_BUILD_MAJOR >= 13:
173 HANDLE_RETURN(cydriver.cuStreamGetCaptureInfo(as_cu(s._h_stream), &cap_status, 2g VbHbh i j WbkcIbhcJbRbXbYbKbLb
174 NULL, NULL, NULL, NULL, NULL))
175 ELSE:
176 HANDLE_RETURN(cydriver.cuStreamGetCaptureInfo(as_cu(s._h_stream), &cap_status,
177 NULL, NULL, NULL, NULL))
178 return cap_status == cydriver.CU_STREAM_CAPTURE_STATUS_ACTIVE 2g VbHbh i j WbkcIbhcJbRbXbYbKbLb
181cdef void _do_copy_with_attributes(
182 cydriver.CUdeviceptr dst, cydriver.CUdeviceptr src, size_t nbytes,
183 object options, cydriver.CUstream hstream,
184):
185 IF CUDA_CORE_BUILD_MAJOR >= 13:
186 # Routed through the memcpy_with_attributes_async() C++ shim since
187 # cydriver.cuMemcpyWithAttributesAsync is absent from cuda-bindings < 13.2.
188 cdef cydriver.CUmemcpyAttributes cu_attr = _to_cu_memcpy_attributes(options) 2g VbHbh i j WbIbJbRbXbYbKbLb
189 with nogil: 2g VbHbh i j WbIbJbRbXbYbKbLb
190 HANDLE_RETURN(memcpy_with_attributes_async(dst, src, nbytes, <void*>&cu_attr, hstream)) 2g VbHbh i j WbIbJbRbXbYbKbLb
191 ELSE:
192 pass # unreachable: _with_attributes_available() is always False on CUDA 12
195cdef void _dispatch_buffer_copy(
196 cydriver.CUdeviceptr dst, cydriver.CUdeviceptr src, size_t nbytes,
197 Stream s, object options, str method_name,
198):
199 """Submit a single copy, honoring CopyOptions when the attributes path is usable."""
200 if options is None: 2+ , - . )b*b+b,b-b.b/bbc;b' 6b5 6 7 n 8 ( 9 7bk l m ! 8b9b!b#bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGba b c ^d_d`d)cmc|c}c~cd e f
201 with nogil: 2+ , - . )b*b+b,b-b.b/bbc;b' 6b5 6 7 n 8 ( 9 7bk l m ! 8b9b!b#bg h i $bj [b:blc^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGba b c ^d_d`d)cmc|c}c~cd e f
202 HANDLE_RETURN(cydriver.cuMemcpyAsync(dst, src, nbytes, as_cu(s._h_stream))) 2+ , - . )b*b+b,b-b.b/bbc;b' 6b5 6 7 n 8 ( 9 7bk l m ! 8b9b!b#bg h i $bj [b:blc^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGba b c ^d_d`d)cmc|c}c~cd e f
203 return 2+ , - . )b*b+b,b-b.b/bbc;b' 6b5 6 7 n 8 ( 9 7bk l m ! 8b9b!b#bg h i $bj [b:blc^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGba b c ^d_d`d)cmc|c}c~cd e f
204 if not isinstance(options, CopyOptions): 2ccdcecg VbHbh i $bj WbkcIbhcJbRbXbYbKbLb
205 raise TypeError( 2ccdcec
206 f"{method_name}: options must be CopyOptions, got {type(options).__name__}" 2ccdcec
207 )
208 if Stream_is_legacy_default_token(s): 2g VbHbh i $bj WbkcIbhcJbRbXbYbKbLb
209 raise TypeError( 2$b
210 f"{method_name} does not accept LEGACY_DEFAULT_STREAM with options " 2$b
211 "(matches copy_batch); cuMemcpyWithAttributesAsync rejects it outright, "
212 "unlike PER_THREAD_DEFAULT_STREAM, which is a real stream to the driver "
213 "and is accepted. Pass an explicit stream, PER_THREAD_DEFAULT_STREAM, "
214 "or options=None."
215 )
216 if _stream_is_capturing(s): 2g VbHbh i j WbkcIbhcJbRbXbYbKbLb
217 raise TypeError( 2kchc
218 f"{method_name} does not support graph capture with options " 2kchc
219 "(matches copy_batch); the driver has no graph-node form of "
220 "cuMemcpyWithAttributesAsync, so options cannot be honored in a graph. "
221 "Use GraphNode.memcpy for a plain (non-attributed) copy node, or pass "
222 "options=None."
223 )
224 if _with_attributes_available(): 2g VbHbh i j WbIbJbRbXbYbKbLb
225 _do_copy_with_attributes(dst, src, nbytes, options, as_cu(s._h_stream)) 2g VbHbh i j WbIbJbRbXbYbKbLb
226 else:
227 _reject_unsupported_during_api_call(
228 options.src_access_order,
229 "cuda.bindings and the driver to both report CUDA 13.2 or newer "
230 "(cuMemcpyWithAttributesAsync is unavailable here)",
231 )
232 # STREAM and ANY never require access sooner than stream order, so
233 # cuMemcpyAsync satisfies them; options are otherwise silently
234 # ignored on this pre-CUDA-13.2 fallback path, matching copy_batch.
235 with nogil:
236 HANDLE_RETURN(cydriver.cuMemcpyAsync(dst, src, nbytes, as_cu(s._h_stream)))
239cdef class Buffer:
240 """Represent a handle to allocated memory.
242 This generic object provides a unified representation for how
243 different memory resources are to give access to their memory
244 allocations.
246 Support for data interchange mechanisms are provided by DLPack.
248 Note
249 ----
250 Pickling an IPC-enabled :class:`Buffer` embeds an
251 :class:`~_memory.IPCBufferDescriptor`. Unpickling reconstructs the buffer
252 by calling :meth:`from_ipc_descriptor` and therefore performs an IPC
253 import. Do not unpickle buffers from untrusted sources.
254 """
255 def __cinit__(self) -> None:
256 self._clear() 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V /g:g;g=g?gmh,h-h@gVe[g]gWeXe+h^g_gnh`gW X Y Z 0 1 * ohphqh.h/h:h+ , - . )b*b+b,b-b.b/b#h$h%h4e5e6e!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 7e8e9e' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb=b3b4g5g6g7g8grh{d9g;hic!g=h#g?hZb$g%g4b5bZe0eJgKgLgMb{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb|d}dxgygsh#fihMg$fth?bYe[f]f'ba b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@d^f_f|ctd1g+gKeQeAg2gBg3g)f) ]b1e}c'h(h)huhvhwhxhyhzhAhBhChDhEhFhGh%fFe*fGdAeGeudjcNc'fSe~cEe(fHhBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f2e3e3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c
258 def _clear(self) -> None:
259 self._h_ptr.reset() # Release the handle 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V /g:g;g=g?gmh,h-h@gVe[g]gWeXe+h^g_gnh`gW X Y Z 0 1 * ohphqh.h/h:h+ , - . )b*b+b,b-b.b/b#h$h%h4e5e6e!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 7e8e9e' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb=b3b4g5g6g7g8grh{d9g;hic!g=h#g?hZb$g%g4b5bZe0eJgKgLgMb{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb|d}dxgygsh#fihMg$fth?bYe[f]f'ba b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@d^f_f|ctd1g+gKeQeAg2gBg3g)f) ]b1e}c'h(h)huhvhwhxhyhzhAhBhChDhEhFhGh%fFe*fGdAeGeudjcNc'fSe~cEe(fHhBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f2e3e3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c
260 self._size = 0 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V /g:g;g=g?gmh,h-h@gVe[g]gWeXe+h^g_gnh`gW X Y Z 0 1 * ohphqh.h/h:h+ , - . )b*b+b,b-b.b/b#h$h%h4e5e6e!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 7e8e9e' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb=b3b4g5g6g7g8grh{d9g;hic!g=h#g?hZb$g%g4b5bZe0eJgKgLgMb{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb|d}dxgygsh#fihMg$fth?bYe[f]f'ba b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@d^f_f|ctd1g+gKeQeAg2gBg3g)f) ]b1e}c'h(h)huhvhwhxhyhzhAhBhChDhEhFhGh%fFe*fGdAeGeudjcNc'fSe~cEe(fHhBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f2e3e3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c
261 self._memory_resource = None 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V /g:g;g=g?gmh,h-h@gVe[g]gWeXe+h^g_gnh`gW X Y Z 0 1 * ohphqh.h/h:h+ , - . )b*b+b,b-b.b/b#h$h%h4e5e6e!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 7e8e9e' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb=b3b4g5g6g7g8grh{d9g;hic!g=h#g?hZb$g%g4b5bZe0eJgKgLgMb{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb|d}dxgygsh#fihMg$fth?bYe[f]f'ba b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@d^f_f|ctd1g+gKeQeAg2gBg3g)f) ]b1e}c'h(h)huhvhwhxhyhzhAhBhChDhEhFhGh%fFe*fGdAeGeudjcNc'fSe~cEe(fHhBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f2e3e3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c
262 self._ipc_data = None 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V /g:g;g=g?gmh,h-h@gVe[g]gWeXe+h^g_gnh`gW X Y Z 0 1 * ohphqh.h/h:h+ , - . )b*b+b,b-b.b/b#h$h%h4e5e6e!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 7e8e9e' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb=b3b4g5g6g7g8grh{d9g;hic!g=h#g?hZb$g%g4b5bZe0eJgKgLgMb{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb|d}dxgygsh#fihMg$fth?bYe[f]f'ba b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@d^f_f|ctd1g+gKeQeAg2gBg3g)f) ]b1e}c'h(h)huhvhwhxhyhzhAhBhChDhEhFhGh%fFe*fGdAeGeudjcNc'fSe~cEe(fHhBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f2e3e3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c
263 self._owner = None 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V /g:g;g=g?gmh,h-h@gVe[g]gWeXe+h^g_gnh`gW X Y Z 0 1 * ohphqh.h/h:h+ , - . )b*b+b,b-b.b/b#h$h%h4e5e6e!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 7e8e9e' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb=b3b4g5g6g7g8grh{d9g;hic!g=h#g?hZb$g%g4b5bZe0eJgKgLgMb{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb|d}dxgygsh#fihMg$fth?bYe[f]f'ba b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@d^f_f|ctd1g+gKeQeAg2gBg3g)f) ]b1e}c'h(h)huhvhwhxhyhzhAhBhChDhEhFhGh%fFe*fGdAeGeudjcNc'fSe~cEe(fHhBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f2e3e3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c
264 self._mem_attrs_inited.store(False) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V /g:g;g=g?gmh,h-h@gVe[g]gWeXe+h^g_gnh`gW X Y Z 0 1 * ohphqh.h/h:h+ , - . )b*b+b,b-b.b/b#h$h%h4e5e6e!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 7e8e9e' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb=b3b4g5g6g7g8grh{d9g;hic!g=h#g?hZb$g%g4b5bZe0eJgKgLgMb{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb|d}dxgygsh#fihMg$fth?bYe[f]f'ba b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@d^f_f|ctd1g+gKeQeAg2gBg3g)f) ]b1e}c'h(h)huhvhwhxhyhzhAhBhChDhEhFhGh%fFe*fGdAeGeudjcNc'fSe~cEe(fHhBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f2e3e3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c
266 def __init__(self, *args, **kwargs) -> None:
267 raise RuntimeError("Buffer objects cannot be instantiated directly. "
268 "Please use MemoryResource APIs.")
270 @classmethod
271 def _init(
272 cls, ptr: DevicePointerType, size_t size, mr: MemoryResource | None = None,
273 ipc_descriptor: IPCBufferDescriptor | None = None,
274 owner : object | None = None,
275 *,
276 stream: Stream | GraphBuilder | None = None,
277 ) -> Buffer:
278 """Create a Buffer from a raw pointer.
280 When ``mr`` is provided, the buffer takes ownership: ``mr.deallocate()``
281 is called when the buffer is closed or garbage collected. When ``owner``
282 is provided, the owner is kept alive but no deallocation is performed.
283 When ``mr`` is provided, a deallocation stream is recorded at creation
284 (``stream`` if given, otherwise ``default_stream()``). Recording a
285 default-stream token requires a CUDA context to be current.
286 """
287 if mr is not None and owner is not None: 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb4g5g6g7g8g{d9g!g#gZb$g%gMb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@dtd1g+gKeQeAg2gBg3gcjdj)f) ejFe*fGdAeGeud'fBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c
288 raise ValueError("owner and memory resource cannot be both specified together") 2ej
289 if stream is not None and mr is None: 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb4g5g6g7g8g{d9g!g#gZb$g%gMb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@dtd1g+gKeQeAg2gBg3gcjdj)f) Fe*fGdAeGeud'fBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c
290 raise ValueError("stream requires a memory resource (mr)") 2cjdj
291 cdef Buffer self = Buffer.__new__(cls) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb4g5g6g7g8g{d9g!g#gZb$g%gMb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@dtd1g+gKeQeAg2gBg3g)f) Fe*fGdAeGeud'fBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c
292 cdef uintptr_t c_ptr = <uintptr_t>(int(ptr)) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb4g5g6g7g8g{d9g!g#gZb$g%gMb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@dtd1g+gKeQeAg2gBg3g)f) Fe*fGdAeGeud'fBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c
293 cdef Stream s
294 cdef cydriver.CUresult _ds_status
295 if mr is not None: 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb4g5g6g7g8g{d9g!g#gZb$g%gMb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@dtd1g+gKeQeAg2gBg3g)f) Fe*fGdAeGeud'fBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c
296 s = Stream_accept(default_stream() if stream is None else stream) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb4g5g6g7g8g{d9g!g#gZb$g%gMb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p # $ ~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFd@dtd1g+gKeQeAg2gBg3g)f) Fe*fGdAeGeudBeHe:d[d]d;d=dd e f cfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/dRe
297 self._h_ptr = deviceptr_create_with_mr(c_ptr, size, mr) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb4g5g6g7g8g{d9g!g#gZb$g%gMb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p # $ ~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFd@dtd1g+gKeQeAg2gBg3g)f) Fe*fGdAeGeudBeHe:d[d]d;d=dd e f cfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/dRe
298 _ds_status = set_deallocation_stream(self._h_ptr, s._h_stream) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb4g5g6g7g8g{d9g!g#gZb$g%gMb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p # $ ~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFd@dtd1g+gKeQeAg2gBg3g)f) Fe*fGdAeGeudBeHe:d[d]d;d=dd e f cfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/dRe
299 if _ds_status != cydriver.CUresult.CUDA_SUCCESS: 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb4g5g6g7g8g{d9g!g#gZb$g%gMb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p # $ ~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFd@dtd1g+gKeQeAg2gBg3g)f) Fe*fGdAeGeudBeHe:d[d]d;d=dd e f cfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/dRe
300 # Reset before raising: the DevicePtrHandle destructor would otherwise
301 # invoke _mr_dealloc_callback, which catches any inner exception and
302 # clears the exception state, swallowing the error we're about to raise.
303 self._h_ptr.reset() 21g+g
304 if _ds_status == cydriver.CUresult.CUDA_ERROR_INVALID_CONTEXT: 21g+g
305 raise RuntimeError( 21g+g
306 "Cannot record a default deallocation stream when no CUDA context is "
307 "current. Call Device.set_current() first, or pass stream= with a "
308 "non-default Stream."
309 )
310 HANDLE_RETURN(_ds_status)
311 else:
312 self._h_ptr = deviceptr_create_with_owner(c_ptr, owner) 24g5g6g7g8g{d9g!g#gZb$g%gMbo p (bfcgc# $ NbObDd'fNg% ;c=c?c@c[c]c^c_c`c{c
313 self._size = size 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb4g5g6g7g8g{d9g!g#gZb$g%gMb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@dtdKeQeAg2gBg3g)f) Fe*fGdAeGeud'fBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c
314 self._memory_resource = mr 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb4g5g6g7g8g{d9g!g#gZb$g%gMb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@dtdKeQeAg2gBg3g)f) Fe*fGdAeGeud'fBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c
315 self._ipc_data = IPCDataForBuffer(ipc_descriptor, True) if ipc_descriptor is not None else None 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb4g5g6g7g8g{d9g!g#gZb$g%gMb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@dtdKeQeAg2gBg3g)f) Fe*fGdAeGeud'fBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c
316 self._owner = owner 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb4g5g6g7g8g{d9g!g#gZb$g%gMb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@dtdKeQeAg2gBg3g)f) Fe*fGdAeGeud'fBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c
317 self._mem_attrs_inited.store(False) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb4g5g6g7g8g{d9g!g#gZb$g%gMb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@dtdKeQeAg2gBg3g)f) Fe*fGdAeGeud'fBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c
318 return self 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b!e#e`f{f$e|f%e'e}f~fagbgOgPgQgRgSgcgdgegTgUgVgWgXgYgZgfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvg0gwg2 3 4 ' )eUb*e6b+e5 6 7 ,en -e8 .e/e:e( ;e9 =e7b?ek l m ! 8b@e9b[e!b]e#b^e_e`e{e|e}e~eafbf1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb4g5g6g7g8g{d9g!g#gZb$g%gMb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb|d}dxgyga b c Ne^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@dtdKeQeAg2gBg3g)f) Fe*fGdAeGeud'fBeHe:d[d]d;d=dd e f cfdfNgefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/d@cRe[c]c^c_c`c{c
320 @staticmethod
321 def _reduce_helper(mr, ipc_descriptor):
322 cdef ContextHandle h_ctx = get_current_context()
323 cdef int device_id
324 if not h_ctx:
325 # Spawned processes unpickle arguments before entering their target,
326 # so initialize the context needed to bind the default-stream token.
327 device_id = mr.device_id
328 (Device(device_id) if device_id >= 0 else Device()).set_current()
329 # The parent process's stream is not portable across processes, so the
330 # pickle path cannot thread an explicit stream through. Seed the
331 # imported buffer's deallocation with the current context's default
332 # stream; the receiver can override it before or during close.
333 return Buffer.from_ipc_descriptor(mr, ipc_descriptor, stream=default_stream())
335 def __reduce__(self) -> tuple[object, ...]:
336 # Unpickling performs a live CUDA IPC import from descriptor bytes in the
337 # pickle stream. Only deserialize Buffers from a trusted principal.
338 # Must not serialize the parent's stream!
339 Buffer_check_open(self) 2{g|g}g~gahbhchdh^b_behfh+fghhh,f-f.f/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbFbGb
340 return Buffer._reduce_helper, (self.memory_resource, self.ipc_descriptor) 2{g|g}g~gahbhchdh^b_behfh+fghhh,f-f.f/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbFbGb
342 @staticmethod
343 def from_handle(
344 ptr: DevicePointerType, size_t size, mr: MemoryResource | None = None,
345 owner: object | None = None,
346 *,
347 stream: Stream | GraphBuilder | None = None,
348 ) -> Buffer:
349 """Create a new :class:`Buffer` object from a pointer.
351 Parameters
352 ----------
353 ptr : :obj:`~_memory.DevicePointerType`
354 Allocated buffer handle object
355 size : int
356 Memory size of the buffer
357 mr : :obj:`~_memory.MemoryResource`, optional
358 Memory resource associated with the buffer. When provided,
359 :meth:`MemoryResource.deallocate` is called when the buffer is
360 closed or garbage collected.
361 owner : object, optional
362 An object holding external allocation that the ``ptr`` points to.
363 The reference is kept as long as the buffer is alive.
364 The ``owner`` and ``mr`` cannot be specified together.
365 stream : :obj:`~_stream.Stream` | :obj:`~graph.GraphBuilder`, optional
366 Keyword-only. The stream used to order the buffer's deallocation
367 when ``mr`` owns the pointer. Defaults to ``default_stream()``.
368 Recording a default-stream token requires a CUDA context to be
369 current. If the buffer may be freed from a different host thread,
370 pass a stream other than the per-thread default stream, which
371 refers to a different stream on each thread.
373 Note
374 ----
375 When neither ``mr`` nor ``owner`` is specified, this creates a
376 non-owning reference. The pointer will NOT be freed when the
377 :class:`Buffer` is closed or garbage collected.
378 """
379 return Buffer._init(ptr, size, mr=mr, owner=owner, stream=stream) 2+ , - . )b*b+b,b-b.b/b' Ub6b5 6 ( 9 7bk l m ! 8b9b!b#bg VbHbh i j WbIb[b:bJbXbYbKbLb4g5g6g7g8g{d9g!g#gZb$g%gMb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb^d_d`dCesd)cbdmcEdIezgcdJe?dOeDePe0b%bOco p (bfcgc# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@dtd1gKeAgBgcj) ejFe*fGdAeGeud'fBe[d]d;d=dNg% ;c=c?c@c[c]c^c_c`c{c
381 @classmethod
382 def from_ipc_descriptor(
383 cls, mr: DeviceMemoryResource | PinnedMemoryResource, ipc_descriptor: IPCBufferDescriptor,
384 *, stream: Stream
385 ) -> Buffer:
386 """Import a buffer that was exported from another process.
388 Parameters
389 ----------
390 mr : :obj:`~_memory.DeviceMemoryResource` | :obj:`~_memory.PinnedMemoryResource`
391 The IPC-enabled memory resource matching the exporting process.
392 ipc_descriptor : :obj:`~_memory.IPCBufferDescriptor`
393 The descriptor exported from another process.
394 stream : :obj:`~_stream.Stream`
395 Keyword-only. The stream used for asynchronous deallocation when
396 the buffer is closed or garbage collected.
398 Note
399 ----
400 The descriptor payload and ``size`` are supplied by the exporting peer
401 and must be treated as untrusted input unless the peer is known to be
402 cooperating.
403 """
404 return _ipc.Buffer_from_ipc_descriptor(cls, mr, ipc_descriptor, stream) 2FjGj%f(f
406 @property
407 @cython.critical_section
408 def ipc_descriptor(self) -> IPCBufferDescriptor:
409 """Descriptor for sharing this buffer with other processes."""
410 Buffer_check_open(self) 2{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGbDd%fEe(f2e3e
411 cdef object ipc_data
412 if self._ipc_data is None: 2{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb%fEe(f2e3e
413 ipc_data = IPCDataForBuffer(_ipc.Buffer_get_ipc_descriptor(self), False) 2{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb%fEe(f2e3e
414 if self._ipc_data is None: 2{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGbEe2e3e
415 self._ipc_data = ipc_data 2{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGbEe2e3e
416 return self._ipc_data.ipc_descriptor 2{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGbEe2e3e
418 def close(self, stream: Stream | GraphBuilder | None = None) -> None:
419 """Deallocate this buffer asynchronously on the given stream.
421 This buffer is released back to their memory resource
422 asynchronously on the given stream.
424 Parameters
425 ----------
426 stream : :obj:`~_stream.Stream` | :obj:`~graph.GraphBuilder`, optional
427 The stream object to use for asynchronous deallocation. If None,
428 the deallocation stream stored in the handle is used.
430 See Also
431 --------
432 set_deallocation_stream
433 Change the deallocation stream without closing the buffer.
434 """
435 Buffer_close(self, stream) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V /g:g;gmhVe]gWeXe^g_gnh`gW X Y Z 0 1 ohphqh+ , - . )b*b+b,b-b.b/b4e5e6e2 3 4 7e8e9e' OhUbPh6bQh5 6 7 Rhn Sh8 ThUhVh( Wh9 Xh7bYhk l m ! 8bZh9b0h!b1h#b2h3h4h5h6h7h8h9h!h1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb=b3b@h[h]h^h_hrh{d`hiiic{hji|hkiZb}h~h4b5bZe0eJgKgLgMbPbQbDbEbSbTbFbGbsh#fihMg$fth?bYe[f]f'bNeCesd)cbdmcEdIecdo p (b# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@d^f_f|ctdKeQe1e}cuhvhwhxhyhzhAhBhChDhEhFhGh%fFeGdAeGeudjcNc'fSe~cEe(fHhBeHe:d[d]d;d=d*h2e3epdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd
437 def set_deallocation_stream(self, stream: Stream | GraphBuilder) -> None:
438 """Change the stream that orders this buffer's eventual deallocation.
440 The buffer remains open and usable. A later :meth:`close` without a
441 stream, garbage collection, or release of the final retained device
442 pointer handle uses the replacement stream.
444 This method does not synchronize streams or establish dependencies.
445 The caller must ensure that allocation and all accesses are ordered
446 before the deallocation on ``stream``.
448 Parameters
449 ----------
450 stream : :obj:`~_stream.Stream` | :obj:`~graph.GraphBuilder`
451 The stream to use for eventual asynchronous deallocation.
453 Raises
454 ------
455 RuntimeError
456 If the buffer is already closed, or if a default-stream token
457 cannot be bound because no CUDA context is current.
458 TypeError
459 If ``stream`` is ``None`` or is not an accepted stream object.
461 Notes
462 -----
463 Synchronizing concurrent mutation and destruction of the same buffer
464 is the caller's responsibility.
465 """
466 Buffer_set_deallocation_stream(self, stream) 2cdJe@dBe
468 def __enter__(self):
469 return self 2#fMg$f[f]f'b
471 def __exit__(self, exc_type, exc_val, exc_tb):
472 self.close() 2#fMg$f[f]f'b
473 return False 2#fMg$f[f]f'b
475 def copy_to(self, dst: Buffer | None = None, *, stream: Stream | GraphBuilder,
476 options: CopyOptions | None = None) -> Buffer:
477 """Copy from this buffer to the dst buffer asynchronously on the given stream.
479 Copies the data from this buffer to the provided dst buffer.
480 If the dst buffer is not provided, then a new buffer is first
481 allocated using the associated memory resource before the copy.
483 Parameters
484 ----------
485 dst : :obj:`~_memory.Buffer`, optional
486 Destination buffer to copy data to. If not provided, a new buffer
487 is allocated using this buffer's memory resource.
488 stream : :obj:`~_stream.Stream` | :obj:`~graph.GraphBuilder`
489 Keyword argument specifying the stream for the
490 asynchronous copy
491 options : :class:`~utils.CopyOptions`, optional
492 Transfer hints (source access order, location hints, overlap mode).
493 Honored when cuda.bindings and the driver are both CUDA 13.2 or
494 newer. Not accepted with ``LEGACY_DEFAULT_STREAM``; use
495 ``PER_THREAD_DEFAULT_STREAM`` instead. Not accepted with a
496 capturing stream either, since a graph cannot represent these
497 attributes; use :meth:`graph.GraphNode.memcpy` for a plain,
498 non-attributed copy node, or pass ``options=None``. On an older
499 cuda.bindings/driver, ``src_access_order`` values of ``STREAM``
500 and ``ANY`` are silently ignored; ``DURING_API_CALL`` raises
501 instead of silently downgrading its guarantee.
503 Raises
504 ------
505 TypeError
506 If ``options`` is not a :class:`~utils.CopyOptions` instance, or
507 if ``options`` is given together with ``LEGACY_DEFAULT_STREAM``
508 or a stream currently in graph capture mode.
509 RuntimeError
510 If ``options.src_access_order`` is ``DURING_API_CALL`` and
511 cuda.bindings or the driver is older than CUDA 13.2: falling
512 back to a plain copy cannot honor that guarantee.
514 """
515 Buffer_check_open(self) 2;b7 n 8 k l m ccdcecg Hbh i $bj Ibhc:blcJbRbKbLba b c bdmcDd|c}c~cd e f
516 cdef Stream s = Stream_accept(stream) 2;b7 n 8 k l m ccdcecg Hbh i $bj Ibhc:blcJbRbKbLba b c bdmcDd|c}c~cd e f
517 cdef size_t src_size = self._size 2;b7 n 8 k l m ccdcecg Hbh i $bj Ibhc:blcJbRbKbLba b c bdmcDd|c}c~cd e f
519 if dst is None: 2;b7 n 8 k l m ccdcecg Hbh i $bj Ibhc:blcJbRbKbLba b c bdmcDd|c}c~cd e f
520 if self._memory_resource is None: 1g
521 raise ValueError("a destination buffer must be provided (this "
522 "buffer does not have a memory_resource)")
523 dst = self._memory_resource.allocate(src_size, stream=s) 1g
524 else:
525 Buffer_check_open(<Buffer>dst) 2;b7 n 8 k l m ccdcecg Hbh i $bj Ibhc:blcJbRbKbLba b c bdmcDd|c}c~cd e f
527 cdef size_t dst_size = dst._size 2;b7 n 8 k l m ccdcecg Hbh i $bj Ibhc:blcJbRbKbLba b c bdmc|c}c~cd e f
528 if dst_size != src_size: 2;b7 n 8 k l m ccdcecg Hbh i $bj Ibhc:blcJbRbKbLba b c bdmc|c}c~cd e f
529 raise ValueError( "buffer sizes mismatch between src and dst (sizes " 2bd
530 f"are: src={src_size}, dst={dst_size})" 2bd
531 )
532 _dispatch_buffer_copy( 2;b7 n 8 k l m ccdcecg Hbh i $bj Ibhc:blcJbRbKbLba b c mc|c}c~cd e f
533 as_cu(dst._h_ptr), as_cu(self._h_ptr), src_size, s, options, "copy_to")
534 return dst 2;b7 n 8 k l m g Hbh i $bj Ib:blcJbRbKbLba b c mc|c}c~cd e f
536 def copy_from(self, src: Buffer, *, stream: Stream | GraphBuilder,
537 options: CopyOptions | None = None) -> None:
538 """Copy from the src buffer to this buffer asynchronously on the given stream.
540 Parameters
541 ----------
542 src : :obj:`~_memory.Buffer`
543 Source buffer to copy data from
544 stream : :obj:`~_stream.Stream` | :obj:`~graph.GraphBuilder`
545 Keyword argument specifying the stream for the
546 asynchronous copy
547 options : :class:`~utils.CopyOptions`, optional
548 Transfer hints (source access order, location hints, overlap mode).
549 Honored when cuda.bindings and the driver are both CUDA 13.2 or
550 newer. Not accepted with ``LEGACY_DEFAULT_STREAM``; use
551 ``PER_THREAD_DEFAULT_STREAM`` instead. Not accepted with a
552 capturing stream either, since a graph cannot represent these
553 attributes; use :meth:`graph.GraphNode.memcpy` for a plain,
554 non-attributed copy node, or pass ``options=None``. On an older
555 cuda.bindings/driver, ``src_access_order`` values of ``STREAM``
556 and ``ANY`` are silently ignored; ``DURING_API_CALL`` raises
557 instead of silently downgrading its guarantee.
559 Raises
560 ------
561 TypeError
562 If ``options`` is not a :class:`~utils.CopyOptions` instance, or
563 if ``options`` is given together with ``LEGACY_DEFAULT_STREAM``
564 or a stream currently in graph capture mode.
565 RuntimeError
566 If ``options.src_access_order`` is ``DURING_API_CALL`` and
567 cuda.bindings or the driver is older than CUDA 13.2: falling
568 back to a plain copy cannot honor that guarantee.
569 """
570 Buffer_check_open(self) 2+ , - . )b*b+b,b-b.b/bbc' 6b5 6 ( 9 7b! 8b9b!b#bccdcecVb$bWbkc[bRbXbYb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb^d_d`dsd)cDd
571 Buffer_check_open(src) 2+ , - . )b*b+b,b-b.b/bbc' 6b5 6 ( 9 7b! 8b9b!b#bccdcecVb$bWbkc[bRbXbYb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb^d_d`dsd)cDd
572 cdef Stream s = Stream_accept(stream) 2+ , - . )b*b+b,b-b.b/bbc' 6b5 6 ( 9 7b! 8b9b!b#bccdcecVb$bWbkc[bRbXbYb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb^d_d`dsd)c
573 cdef size_t dst_size = self._size 2+ , - . )b*b+b,b-b.b/bbc' 6b5 6 ( 9 7b! 8b9b!b#bccdcecVb$bWbkc[bRbXbYb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb^d_d`dsd)c
574 cdef size_t src_size = src._size 2+ , - . )b*b+b,b-b.b/bbc' 6b5 6 ( 9 7b! 8b9b!b#bccdcecVb$bWbkc[bRbXbYb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb^d_d`dsd)c
576 if src_size != dst_size: 2+ , - . )b*b+b,b-b.b/bbc' 6b5 6 ( 9 7b! 8b9b!b#bccdcecVb$bWbkc[bRbXbYb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb^d_d`dsd)c
577 raise ValueError( "buffer sizes mismatch between src and dst (sizes " 2sd
578 f"are: src={src_size}, dst={dst_size})" 2sd
579 )
580 _dispatch_buffer_copy( 2+ , - . )b*b+b,b-b.b/bbc' 6b5 6 ( 9 7b! 8b9b!b#bccdcecVb$bWbkc[bRbXbYb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb^d_d`d)c
581 as_cu(self._h_ptr), as_cu(src._h_ptr), dst_size, s, options, "copy_from")
583 def fill(self, value: int | BufferProtocol, *, stream: Stream | GraphBuilder) -> None:
584 """Fill this buffer with a repeating byte pattern.
586 Parameters
587 ----------
588 value : int | :obj:`collections.abc.Buffer`
589 - int: Must be in range [0, 256). Converted to 1 byte.
590 - :obj:`collections.abc.Buffer`: Must be 1, 2, or 4 bytes.
591 stream : :obj:`~_stream.Stream` | :obj:`~graph.GraphBuilder`
592 Stream for the asynchronous fill operation.
594 Raises
595 ------
596 TypeError
597 If value is not an int and does not support the buffer protocol.
598 ValueError
599 If value byte length is not 1, 2, or 4.
600 If buffer size is not divisible by value byte length.
601 OverflowError
602 If int value is outside [0, 256).
604 """
605 Buffer_check_open(self) 2=g?g@gVe[gWeXe+ , - . bc;b' Ubn ( k l m g h i j ~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeDd
606 cdef Stream s_stream = Stream_accept(stream) 2=g?g@gVe[gWeXe+ , - . bc;b' Ubn ( k l m g h i j ~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodze
607 cdef unsigned int val
608 cdef unsigned int elem_size
609 val, elem_size = _parse_fill_value(value) 2=g?g@gVe[gWeXe+ , - . bc;b' Ubn ( k l m g h i j ~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodze
611 cdef size_t buffer_size = self._size 2=g?g@gVe[gWeXe+ , - . bc;b' Ubn ( k l m g h i j *cddPcedQc+cRc,c-c.cScTcUcVcWcXc/c:cYcZcfd0c1cgd2chdncidoc3cpc4c5c6cqcrcsctcucvc7c8cwcxcjdyczckd9cldAcmdBc!cCc#c$c%cDcEcFcGcHcIc'c(cJcKcndLcMcod
612 cdef cydriver.CUdeviceptr dst = as_cu(self._h_ptr) 2=g?g@gVe[gWeXe+ , - . bc;b' Ubn ( k l m g h i j *cddPcedQc+cRc,c-c.cScTcUcVcWcXc/c:cYcZcfd0c1cgd2chdncidoc3cpc4c5c6cqcrcsctcucvc7c8cwcxcjdyczckd9cldAcmdBc!cCc#c$c%cDcEcFcGcHcIc'c(cJcKcndLcMcod
613 cdef cydriver.CUstream s = as_cu(s_stream._h_stream) 2=g?g@gVe[gWeXe+ , - . bc;b' Ubn ( k l m g h i j *cddPcedQc+cRc,c-c.cScTcUcVcWcXc/c:cYcZcfd0c1cgd2chdncidoc3cpc4c5c6cqcrcsctcucvc7c8cwcxcjdyczckd9cldAcmdBc!cCc#c$c%cDcEcFcGcHcIc'c(cJcKcndLcMcod
615 if elem_size == 1: 2=g?g@gVe[gWeXe+ , - . bc;b' Ubn ( k l m g h i j *cddPcedQc+cRc,c-c.cScTcUcVcWcXc/c:cYcZcfd0c1cgd2chdncidoc3cpc4c5c6cqcrcsctcucvc7c8cwcxcjdyczckd9cldAcmdBc!cCc#c$c%cDcEcFcGcHcIc'c(cJcKcndLcMcod
616 with nogil: 2=g?g@gVe[gWeXe+ , - . bc;b' Ubn ( k l m g h i j *c+c,c-c.c/c:c2c3c4c5c6c7c8c9c!c#c$c%c'c(c
617 HANDLE_RETURN(cydriver.cuMemsetD8Async(dst, val, buffer_size, s)) 2=g?g@gVe[gWeXe+ , - . bc;b' Ubn ( k l m g h i j *c+c,c-c.c/c:c2c3c4c5c6c7c8c9c!c#c$c%c'c(c
618 elif elem_size == 2:
619 if buffer_size & 0x1: 2ddPcScTcUcYcZcfdhdncqcrcscwcxcjdldAcDcEcFcJcKcnd
620 raise ValueError(f"buffer size ({buffer_size}) must be divisible by 2") 2ddfdhdjdldnd
621 with nogil: 2PcScTcUcYcZcncqcrcscwcxcAcDcEcFcJcKc
622 HANDLE_RETURN(cydriver.cuMemsetD16Async(dst, val, buffer_size // 2, s)) 2PcScTcUcYcZcncqcrcscwcxcAcDcEcFcJcKc
623 elif elem_size == 4:
624 if buffer_size & 0x3: 2edQcRcVcWcXc0c1cgdidocpctcucvcyczckdmdBcCcGcHcIcLcMcod
625 raise ValueError(f"buffer size ({buffer_size}) must be divisible by 4") 2edgdidkdmdod
626 with nogil: 2QcRcVcWcXc0c1cocpctcucvcyczcBcCcGcHcIcLcMc
627 HANDLE_RETURN(cydriver.cuMemsetD32Async(dst, val, buffer_size // 4, s)) 2QcRcVcWcXc0c1cocpctcucvcyczcBcCcGcHcIcLcMc
629 def __dlpack__(
630 self,
631 *,
632 stream: int | None = None,
633 max_version: tuple[int, int] | None = None,
634 dl_device: tuple[int, int] | None = None,
635 copy: bool | None = None,
636 ) -> object:
637 # Note: we ignore the stream argument entirely (as if it is -1).
638 # It is the user's responsibility to maintain stream order.
639 Buffer_check_open(self) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 a b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb?dOcDd) ]bd e f
640 if dl_device is not None: 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 a b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb?dOc) ]bd e f
641 raise BufferError("Sorry, not supported: dl_device other than None") 2Oc
642 if copy is True: 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 a b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb?dOc) ]bd e f
643 raise BufferError("Sorry, not supported: copy=True") 2Oc
644 if max_version is None: 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 a b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb?dOc) ]bd e f
645 versioned = False 2?dOc
646 else:
647 if not isinstance(max_version, tuple) or len(max_version) != 2: 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 a b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbOc) ]bd e f
648 raise BufferError(f"Expected max_version tuple[int, int], got {max_version}") 2Oc
649 versioned = max_version >= (1, 0) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 a b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbOc) ]bd e f
650 return make_py_capsule(self, versioned) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 a b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb?dOc) ]bd e f
652 def __dlpack_device__(self) -> tuple[int, int]:
653 Buffer_check_open(self) 2OeDePe0b%bDd) ]b
654 return classify_dl_device(self) 2OeDePe0b%b) ]b
656 def __buffer__(self, flags: int, /) -> memoryview:
657 # Support for Python-level buffer protocol as per PEP 688.
658 # This raises a BufferError unless:
659 # 1. Python is 3.12+
660 # 2. This Buffer object is host accessible
661 raise NotImplementedError("WIP: Buffer.__buffer__ hasn't been implemented yet.")
663 def __release_buffer__(self, buffer: memoryview, /) -> None:
664 # Supporting method paired with __buffer__.
665 raise NotImplementedError("WIP: Buffer.__release_buffer__ hasn't been implemented yet.")
667 @property
668 def device_id(self) -> int:
669 """Return the device ordinal of this buffer."""
670 Buffer_check_open(self) 2#h$h%h|d}d?b'bDeOco p (bfcgc# $ NbObDd^f_f'h(h)hSe[d]d=d% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d@c[c]c^c_c`c{c
671 if self._memory_resource is not None: 2#h$h%h|d}d?b'bDeOco p (bfcgc# $ NbOb^f_f'h(h)hSe[d]d=d% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d@c[c]c^c_c`c{c
672 return self._memory_resource.device_id 2#h$h%h|d}dDeOc^f_f'h(h)hSe[d]d=dMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d
673 _init_memory_attrs(self) 2?b'bo p (bfcgc# $ NbOb% ;c=c?c@c[c]c^c_c`c{c
674 return self._mem_attrs.device_id 2?b'bo p (bfcgc# $ NbOb% ;c=c?c@c[c]c^c_c`c{c
676 @property
677 def handle(self) -> int:
678 """Return the buffer handle object.
680 .. caution::
682 This handle is a Python object. To get the memory address of the underlying C
683 handle, call ``int(Buffer.handle)``.
684 """
685 # Return raw integer for compatibility with ctypes and other tools
686 # that expect a raw pointer value
687 return as_intptr(self._h_ptr) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V /g:g;g=g?g@gVe[g]gWeXe+h^g_g`gW X Y Z 0 1 * + , - . )b*b+b,b-b.b/b#h$h%h!e#e`f{f$e|f%e'e}f~fagbgcgdgegfggghgigjgkglgmgngogpgqgrgsgtgug(ebc;bvgwg2 3 4 ' Ub6b5 6 7 n 8 ( 9 7bk l m ! 8b9b!b#bg VbHbh i j WbIb[b:blcJbRbXbYbKbLb3bCg4gDg5gEg6gFg7g8g{d9gicGg!gHg#gZb$gIg%g4b5bMb^b_b`b{b|b}bPbQb~bacDbEbSbTbFbGb|d}dxgyg#fih$f?bYe]f'ba b c ^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbCe)cmccdJe?dOco p # $ 2cncoc3cpc4c5c6cqcrcsctcucvc7c8cwcxcyczc9cAcBc!cCc#c$c%cDcEcFcGcHcIc'c(cJcKcLcMcad|ctd)f) ]b}c'h(h)hFe*fGeud~cHe;d=dd e f *hoiNgpdqdrd% ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d@cRe[c]c^c_c`c{c
689 @property
690 def is_closed(self) -> bool:
691 """Whether this buffer has been closed."""
692 return self._h_ptr.get() == NULL 23bCgDgEgFg,gicGgHg-g.gIg4b5b@d;d=d*h
694 def __eq__(self, other: object) -> bool:
695 if not isinstance(other, Buffer): 2#e$e%e'eoiNghjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjfjpiqi
696 return NotImplemented 2oihjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEj
697 cdef Buffer other_buf = <Buffer>other 2#e$e%e'eoiNgfjpiqi
698 return (as_intptr(self._h_ptr) == as_intptr(other_buf._h_ptr) and 2#e$e%e'eoiNgfjpiqi
699 self._size == other_buf._size) 2oiNgpiqi
701 def __hash__(self) -> int:
702 return hash((as_intptr(self._h_ptr), self._size)) 2NgHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj0j1j2j3j4j5j6j7j8jpiqi
704 def __repr__(self) -> str:
705 maybe_is_mapped = " is_mapped=True" if self.is_mapped else "" 2!e(e^b_b'g(g+f,f-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@f*hgj
706 return f"<Buffer ptr={as_intptr(self._h_ptr):#x} size={self._size}{maybe_is_mapped}>" 2!e(e^b_b'g(g+f,f-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@f*hgj
708 @property
709 def is_device_accessible(self) -> bool:
710 """Return True if this buffer can be accessed by the GPU, otherwise False."""
711 Buffer_check_open(self) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 ?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb?dOeDePe0b%bOco p (bfcgc# $ NbObadDd) ]b1eSeEed e f % ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d@c[c]c^c_c`c{c
712 if self._memory_resource is not None: 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 ?b'ba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb?dOeDePe0b%bOco p (bfcgc# $ NbObad) ]b1eSeEed e f % ;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d@c[c]c^c_c`c{c
713 return self._memory_resource.is_device_accessible 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 a b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb?dOeDePe0b%bOcad) ]b1eSeEed e f MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*d+d,d-d.d/d
714 _init_memory_attrs(self) 2?b'bo p (bfcgc# $ NbOb% ;c=c?c@c[c]c^c_c`c{c
715 return self._mem_attrs.is_device_accessible 2?b'bo p (bfcgc# $ NbOb% ;c=c?c@c[c]c^c_c`c{c
717 @property
718 def is_host_accessible(self) -> bool:
719 """Return True if this buffer can be accessed by the CPU, otherwise False."""
720 Buffer_check_open(self) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 a b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb?dOeDePe0b%bOco p (bfcgc# $ NbOb*cPcQc+cRc,c-c.cScTcUcVcWcXc/c:cYcZc0c1c2cncoc3cpc4c5c6cqcrcsctcucvc7c8cwcxcyczc9cAcBc!cCc#c$c%cDcEcFcGcHcIc'c(cJcKcLcMcadDd) ]b1eSeEed e f %
721 if self._memory_resource is not None: 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 a b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb?dOeDePe0b%bOco p (bfcgc# $ NbOb*cPcQc+cRc,c-c.cScTcUcVcWcXc/c:cYcZc0c1c2cncoc3cpc4c5c6cqcrcsctcucvc7c8cwcxcyczc9cAcBc!cCc#c$c%cDcEcFcGcHcIc'c(cJcKcLcMcad) ]b1eSeEed e f %
722 return self._memory_resource.is_host_accessible 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 a b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb?dOeDePe0b%bOc*cPcQc+cRc,c-c.cScTcUcVcWcXc/c:cYcZc0c1c2cncoc3cpc4c5c6cqcrcsctcucvc7c8cwcxcyczc9cAcBc!cCc#c$c%cDcEcFcGcHcIc'c(cJcKcLcMcad) ]b1eSeEed e f
723 _init_memory_attrs(self) 2o p (bfcgc# $ NbOb%
724 return self._mem_attrs.is_host_accessible 2o p (bfcgc# $ NbOb%
726 @property
727 def is_managed(self) -> bool:
728 """Return True if this buffer is CUDA managed (unified) memory, otherwise False."""
729 Buffer_check_open(self) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%bDd) ]bjcNcd e f
730 _init_memory_attrs(self) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%b) ]bjcNcd e f
731 if self._mem_attrs.is_managed: 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 =b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5bMba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0b%b) ]bjcNcd e f
732 return True 2=b3bCgDgEgFg,gjhkhicGgHg-g.gZblhIg4b5b%b) ]b
733 # Pool-allocated managed memory does not set CU_POINTER_ATTRIBUTE_IS_MANAGED,
734 # so fall back to the memory resource when it advertises managed allocations.
735 return self._memory_resource is not None and self._memory_resource.is_managed 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 Mba b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0bjcNcd e f
737 @property
738 def is_mapped(self) -> bool:
739 """Return True if this buffer is mapped into the process via IPC."""
740 return getattr(self._ipc_data, "is_mapped", False) 2!e(e^b_b'g(g+f,f-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fad*hgj
743 @property
744 def memory_resource(self) -> MemoryResource:
745 """Return the memory resource associated with this buffer."""
746 return self._memory_resource 2+ , - . )b*b+b,b-b.b/b' 6b5 6 ( 9 7b! 8b9b!b#b{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb?b'bCead|c1e}c%fSe~cEe(f[d]d2e3e;c=c?cMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLe+d,dMe-d.d/d@c[c]c^c_c`c{c
748 @property
749 def size(self) -> int:
750 """Return the memory size of this buffer."""
751 return self._size 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * + , - . )b*b+b,b-b.b/b#h$h%h2 3 4 ' Ub6b5 6 7 n 8 ( 9 ci7bk l m ! 8b9b!b#bdieifi1b2bg VbHbh i j WbIb[b:blcJbRbXbYbKbLb3bCg4gDg5gEg6gFg7g8g{d9gicGg!gHg#gZb$gIg%g4b5bMb{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb|d}d#f$f?bYe[fa b c ^d_d`d/ : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbcdJe?dOcad^f_f|c)f) ]b1e}c'h(h)hSe~cEeHe[d]d;d=dd e f Ng2e3epdvdwdxdydzdAdBdCdqdrdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLe+d,dMe-d.d/d
753 @property
754 def owner(self) -> object:
755 """Return the object holding external allocation."""
756 return self._owner
759cdef class MemoryResource:
760 """Abstract base class for memory resources that manage allocation and
761 deallocation of buffers.
763 Subclasses must implement methods for allocating and deallocation, as well
764 as properties associated with this memory resource from which all allocated
765 buffers will inherit. (Since all :class:`Buffer` instances allocated and
766 returned by the :meth:`allocate` method would hold a reference to self, the
767 buffer properties are retrieved simply by looking up the underlying memory
768 resource's respective property.)
769 """
771 def allocate(self, size_t size, *, stream: Stream | GraphBuilder) -> Buffer:
772 """Allocate a buffer of the requested size.
774 Parameters
775 ----------
776 size : int
777 The size of the buffer to allocate, in bytes.
778 stream : :obj:`~_stream.Stream` | :obj:`~graph.GraphBuilder`
779 Keyword-only. The stream on which to perform the allocation
780 asynchronously. Must be passed explicitly; pass
781 ``device.default_stream`` to use the default stream. For subclasses
782 that support stream-ordered deallocation, this stream also orders
783 the buffer's eventual deallocation, so if the buffer may be freed
784 from a different host thread, prefer a stream other than the
785 per-thread default stream, which refers to a different stream on
786 each thread.
788 Returns
789 -------
790 Buffer
791 The allocated buffer object, which can be used for device or host operations
792 depending on the resource's properties.
793 """
794 raise TypeError("MemoryResource.allocate must be implemented by subclasses.")
796 def deallocate(
797 self,
798 ptr: DevicePointerType,
799 size_t size,
800 *,
801 stream: Stream | GraphBuilder
802 ) -> None:
803 """Deallocate a buffer previously allocated by this resource.
805 Parameters
806 ----------
807 ptr : :obj:`~_memory.DevicePointerType`
808 The pointer or handle to the buffer to deallocate.
809 size : int
810 The size of the buffer to deallocate, in bytes.
811 stream : :obj:`~_stream.Stream` | :obj:`~graph.GraphBuilder`
812 Keyword-only. The stream on which to perform the deallocation
813 asynchronously. Must be passed explicitly; pass
814 ``device.default_stream`` to use the default stream.
815 """
816 raise TypeError("MemoryResource.deallocate must be implemented by subclasses.")
818 @property
819 def is_device_accessible(self) -> bool:
820 """Whether buffers allocated by this resource are device-accessible."""
821 raise TypeError("MemoryResource.is_device_accessible must be implemented by subclasses.")
823 @property
824 def is_host_accessible(self) -> bool:
825 """Whether buffers allocated by this resource are host-accessible."""
826 raise TypeError("MemoryResource.is_host_accessible must be implemented by subclasses.")
828 @property
829 def is_managed(self) -> bool:
830 """Whether buffers allocated by this resource are CUDA managed (unified) memory."""
831 return False 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 * 2 3 4 a b c / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCb0bjcNcd e f
833 @property
834 def device_id(self) -> int:
835 """Device ID associated with this memory resource, or -1 if not applicable."""
836 raise TypeError("MemoryResource.device_id must be implemented by subclasses.")
839# Buffer Implementation Helpers
840# -----------------------------
841cdef Buffer Buffer_from_deviceptr_handle(
842 DevicePtrHandle h_ptr,
843 size_t size,
844 MemoryResource mr,
845 object ipc_descriptor = None,
846 type cls = Buffer,
847):
848 """Create a Buffer (or subclass instance) from an existing DevicePtrHandle."""
849 cdef Buffer buf = cls.__new__(cls) 2/g:g;g=g?gmh,h-h@gVe[g]gWeXe+h^g_gnh`gohphqh.h/h:h+ , - . )b*b+b,b-b.b/b#h$h%h4e5e6ebc;b7e8e9e)e*e+e5 6 7 ,en -e8 .e/e:e;e9 =e?ek l m ! @e[e]e^e_e`e{e|e}e~eafbf1b2bg h i j =b3brh;hic=h?h4b5bZe0eJgKgLg{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb|d}dsh#fihMg$fth?bYe[f]f'ba b c o p ^f_f|c]b1e}c'h(h)huhvhwhxhyhzhAhBhChDhEhFhGh%fjcNcSe~cEe(fHhd e f cfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f2e3e3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/dRe
850 buf._h_ptr = h_ptr 2/g:g;g=g?gmh,h-h@gVe[g]gWeXe+h^g_gnh`gohphqh.h/h:h+ , - . )b*b+b,b-b.b/b#h$h%h4e5e6ebc;b7e8e9e)e*e+e5 6 7 ,en -e8 .e/e:e;e9 =e?ek l m ! @e[e]e^e_e`e{e|e}e~eafbf1b2bg h i j =b3brh;hic=h?h4b5bZe0eJgKgLg{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb|d}dsh#fihMg$fth?bYe[f]f'ba b c o p ^f_f|c]b1e}c'h(h)huhvhwhxhyhzhAhBhChDhEhFhGh%fjcNcSe~cEe(fHhd e f cfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f2e3e3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/dRe
851 buf._size = size 2/g:g;g=g?gmh,h-h@gVe[g]gWeXe+h^g_gnh`gohphqh.h/h:h+ , - . )b*b+b,b-b.b/b#h$h%h4e5e6ebc;b7e8e9e)e*e+e5 6 7 ,en -e8 .e/e:e;e9 =e?ek l m ! @e[e]e^e_e`e{e|e}e~eafbf1b2bg h i j =b3brh;hic=h?h4b5bZe0eJgKgLg{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb|d}dsh#fihMg$fth?bYe[f]f'ba b c o p ^f_f|c]b1e}c'h(h)huhvhwhxhyhzhAhBhChDhEhFhGh%fjcNcSe~cEe(fHhd e f cfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f2e3e3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/dRe
852 buf._memory_resource = mr 2/g:g;g=g?gmh,h-h@gVe[g]gWeXe+h^g_gnh`gohphqh.h/h:h+ , - . )b*b+b,b-b.b/b#h$h%h4e5e6ebc;b7e8e9e)e*e+e5 6 7 ,en -e8 .e/e:e;e9 =e?ek l m ! @e[e]e^e_e`e{e|e}e~eafbf1b2bg h i j =b3brh;hic=h?h4b5bZe0eJgKgLg{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb|d}dsh#fihMg$fth?bYe[f]f'ba b c o p ^f_f|c]b1e}c'h(h)huhvhwhxhyhzhAhBhChDhEhFhGh%fjcNcSe~cEe(fHhd e f cfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f2e3e3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/dRe
853 buf._ipc_data = IPCDataForBuffer(ipc_descriptor, True) if ipc_descriptor is not None else None 2/g:g;g=g?gmh,h-h@gVe[g]gWeXe+h^g_gnh`gohphqh.h/h:h+ , - . )b*b+b,b-b.b/b#h$h%h4e5e6ebc;b7e8e9e)e*e+e5 6 7 ,en -e8 .e/e:e;e9 =e?ek l m ! @e[e]e^e_e`e{e|e}e~eafbf1b2bg h i j =b3brh;hic=h?h4b5bZe0eJgKgLg{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb|d}dsh#fihMg$fth?bYe[f]f'ba b c o p ^f_f|c]b1e}c'h(h)huhvhwhxhyhzhAhBhChDhEhFhGh%fjcNcSe~cEe(fHhd e f cfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f2e3e3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/dRe
854 buf._owner = None 2/g:g;g=g?gmh,h-h@gVe[g]gWeXe+h^g_gnh`gohphqh.h/h:h+ , - . )b*b+b,b-b.b/b#h$h%h4e5e6ebc;b7e8e9e)e*e+e5 6 7 ,en -e8 .e/e:e;e9 =e?ek l m ! @e[e]e^e_e`e{e|e}e~eafbf1b2bg h i j =b3brh;hic=h?h4b5bZe0eJgKgLg{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb|d}dsh#fihMg$fth?bYe[f]f'ba b c o p ^f_f|c]b1e}c'h(h)huhvhwhxhyhzhAhBhChDhEhFhGh%fjcNcSe~cEe(fHhd e f cfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f2e3e3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/dRe
855 buf._mem_attrs_inited.store(False) 2/g:g;g=g?gmh,h-h@gVe[g]gWeXe+h^g_gnh`gohphqh.h/h:h+ , - . )b*b+b,b-b.b/b#h$h%h4e5e6ebc;b7e8e9e)e*e+e5 6 7 ,en -e8 .e/e:e;e9 =e?ek l m ! @e[e]e^e_e`e{e|e}e~eafbf1b2bg h i j =b3brh;hic=h?h4b5bZe0eJgKgLg{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb|d}dsh#fihMg$fth?bYe[f]f'ba b c o p ^f_f|c]b1e}c'h(h)huhvhwhxhyhzhAhBhChDhEhFhGh%fjcNcSe~cEe(fHhd e f cfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f2e3e3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/dRe
856 return buf 2/g:g;g=g?gmh,h-h@gVe[g]gWeXe+h^g_gnh`gohphqh.h/h:h+ , - . )b*b+b,b-b.b/b#h$h%h4e5e6ebc;b7e8e9e)e*e+e5 6 7 ,en -e8 .e/e:e;e9 =e?ek l m ! @e[e]e^e_e`e{e|e}e~eafbf1b2bg h i j =b3brh;hic=h?h4b5bZe0eJgKgLg{g|g}g~gahbhchdh^b_b'g(gehIhfhJh+fKhghLhhhMh,fNh-f.f)g*g/f:f`b{b|b}bPbQb~bac;f=f?f@fDbEbSbTbFbGb|d}dsh#fihMg$fth?bYe[f]f'ba b c o p ^f_f|c]b1e}c'h(h)huhvhwhxhyhzhAhBhChDhEhFhGh%fjcNcSe~cEe(fHhd e f cfdfefffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfBfCfDfEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfWfXfYfZf0f1f2f2e3e3f4f5f6f7f8f9f!fpdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd% MdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2d3d4d5d6d7d8d9d!d#d$d%d'd(d)d*dLeTeUe+d,dMe-d.d/dRe
859cdef tuple Buffer_coerce_batch(object buffers, str what, str single_hint):
860 """Coerce ``buffers`` to a ``tuple[Buffer, ...]``; reject a bare Buffer.
862 Shared by the batched free functions. Passing one Buffer is rejected
863 rather than treated as a one-element batch so that the per-buffer API
864 named by ``single_hint`` stays the single obvious way to do it.
865 """
866 cdef list out
867 if isinstance(buffers, Buffer): 2' Ub6b5 6 7 n 8 limi( 9 ci7bk l m ! 8b9b!b#bnidieifigihiaibi1b2b=b3b4b5bZe0eJgKgLg
868 raise TypeError( 2biJgKgLg
869 f"{what}: pass a sequence of Buffers; for a single buffer use {single_hint}" 2biJgKgLg
870 )
871 if not isinstance(buffers, Sequence): 2' Ub6b5 6 7 n 8 limi( 9 ci7bk l m ! 8b9b!b#bnidieifigihiaibi1b2b=b3b4b5bZe0e
872 raise TypeError( 2ai
873 f"{what}: buffers must be a sequence of Buffer, got {type(buffers).__name__}" 2ai
874 )
875 if not buffers: 2' Ub6b5 6 7 n 8 limi( 9 ci7bk l m ! 8b9b!b#bnidieifigihiaibi1b2b=b3b4b5bZe0e
876 raise ValueError(f"{what}: empty buffers sequence") 2gi
877 out = [] 2' Ub6b5 6 7 n 8 limi( 9 ci7bk l m ! 8b9b!b#bnidieifigihiaibi1b2b=b3b4b5bZe0e
878 for item in buffers: 2' Ub6b5 6 7 n 8 limi( 9 ci7bk l m ! 8b9b!b#bnidieifigihiaibi1b2b=b3b4b5bZe0e
879 if not isinstance(item, Buffer): 2' Ub6b5 6 7 n 8 limi( 9 ci7bk l m ! 8b9b!b#bnidieifigihiaibi1b2b=b3b4b5bZe0e
880 raise TypeError(f"{what}: expected Buffer, got {type(item).__name__}") 2hi
881 Buffer_check_open(<Buffer>item) 2' Ub6b5 6 7 n 8 limi( 9 ci7bk l m ! 8b9b!b#bnidieifigihiaibi1b2b=b3b4b5bZe0e
882 out.append(item) 2' Ub6b5 6 7 n 8 limi( 9 ci7bk l m ! 8b9b!b#bnidieifigihiaibi1b2b=b3b4b5bZe0e
883 return tuple(out) 2' Ub6b5 6 7 n 8 limi( 9 ci7bk l m ! 8b9b!b#bnidieifigihiaibi1b2b=b3b4b5bZe0e
885cdef inline void Buffer_set_deallocation_stream(Buffer self, object stream):
886 """Validate and replace a live buffer's deallocation recipe."""
887 Buffer_check_open(self) 24e5e6e7e8e9eOhUbPhQh5 6 7 Rhn Sh8 ThUhVhWh9 XhYhk l m ! Zh0h1h2h3h4h5h6h7h8h9h!h1b2bg VbHbh i j WbIb[b:bJbXbYbKbLbYeEdcdJeFd@d|ctd}cGdud~cBe:d
888 cdef Stream s = Stream_accept(stream) 24e5e6e7e8e9eOhUbPhQh5 6 7 Rhn Sh8 ThUhVhWh9 XhYhk l m ! Zh0h1h2h3h4h5h6h7h8h9h!h1b2bg VbHbh i j WbIb[b:bJbXbYbKbLbYeEdcdJeFd@d|ctd}cGdud~cBe:d
889 _apply_deallocation_stream(self._h_ptr, s._h_stream) 24e5e6e7e8e9eOhUbPhQh5 6 7 Rhn Sh8 ThUhVhWh9 XhYhk l m ! Zh0h1h2h3h4h5h6h7h8h9h!h1b2bg VbHbh i j WbIb[b:bJbXbYbKbLbYeEdcdJeFd|ctd}cGdud~c:d
892cdef inline void Buffer_close(Buffer self, object stream):
893 """Close a buffer, freeing its memory."""
894 if not self._h_ptr: 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V /g:g;gmhVe]gWeXe^g_gnh`gW X Y Z 0 1 ohphqh+ , - . )b*b+b,b-b.b/b4e5e6e2 3 4 7e8e9e' OhUbPh6bQh5 6 7 Rhn Sh8 ThUhVh( Wh9 Xh7bYhk l m ! 8bZh9b0h!b1h#b2h3h4h5h6h7h8h9h!h1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb=b3b@h[h]h^h_hrh{d`hiiic{hji|hkiZb}h~h4b5bZe0eJgKgLgMbPbQbDbEbSbTbFbGbsh#fihMg$fth?bYe[f]f'bNeCesd)cbdmcEdIecdo p (b# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@d^f_f|ctdKeQe1e}cuhvhwhxhyhzhAhBhChDhEhFhGh%fFeGdAeGeudjcNc'fSe~cEe(fHhBeHe:d[d]d;d=d*h2e3epdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd
895 return 2*h
896 # Update deallocation stream if provided
897 if stream is not None: 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V /g:g;gmhVe]gWeXe^g_gnh`gW X Y Z 0 1 ohphqh+ , - . )b*b+b,b-b.b/b4e5e6e2 3 4 7e8e9e' OhUbPh6bQh5 6 7 Rhn Sh8 ThUhVh( Wh9 Xh7bYhk l m ! 8bZh9b0h!b1h#b2h3h4h5h6h7h8h9h!h1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb=b3b@h[h]h^h_hrh{d`hiiic{hji|hkiZb}h~h4b5bZe0eJgKgLgMbPbQbDbEbSbTbFbGbsh#fihMg$fth?bYe[f]f'bNeCesd)cbdmcEdIecdo p (b# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@d^f_f|ctdKeQe1e}cuhvhwhxhyhzhAhBhChDhEhFhGh%fFeGdAeGeudjcNc'fSe~cEe(fHhBeHe:d[d]d;d=d*h2e3epdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd
898 Buffer_set_deallocation_stream(self, stream) 24e5e6e7e8e9eOhUbPhQh5 6 7 Rhn Sh8 ThUhVhWh9 XhYhk l m ! Zh0h1h2h3h4h5h6h7h8h9h!h1b2bg VbHbh i j WbIb[b:bJbXbYbKbLbYeEdFd@d|ctd}cGdud~c:d
899 # Reset handle - RAII deleter will free the memory (and release owner ref in C++)
900 self._h_ptr.reset() 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V /g:g;gmhVe]gWeXe^g_gnh`gW X Y Z 0 1 ohphqh+ , - . )b*b+b,b-b.b/b4e5e6e2 3 4 7e8e9e' OhUbPh6bQh5 6 7 Rhn Sh8 ThUhVh( Wh9 Xh7bYhk l m ! 8bZh9b0h!b1h#b2h3h4h5h6h7h8h9h!h1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb=b3b@h[h]h^h_hrh{d`hiiic{hji|hkiZb}h~h4b5bZe0eJgKgLgMbPbQbDbEbSbTbFbGbsh#fihMg$fth?bYe[f]f'bNeCesd)cbdmcEdIecdo p (b# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@d^f_f|ctdKeQe1e}cuhvhwhxhyhzhAhBhChDhEhFhGh%fFeGdAeGeudjcNc'fSe~cEe(fHhBeHe:d[d]d;d=d*h2e3epdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd
901 self._size = 0 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V /g:g;gmhVe]gWeXe^g_gnh`gW X Y Z 0 1 ohphqh+ , - . )b*b+b,b-b.b/b4e5e6e2 3 4 7e8e9e' OhUbPh6bQh5 6 7 Rhn Sh8 ThUhVh( Wh9 Xh7bYhk l m ! 8bZh9b0h!b1h#b2h3h4h5h6h7h8h9h!h1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb=b3b@h[h]h^h_hrh{d`hiiic{hji|hkiZb}h~h4b5bZe0eJgKgLgMbPbQbDbEbSbTbFbGbsh#fihMg$fth?bYe[f]f'bNeCesd)cbdmcEdIecdo p (b# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@d^f_f|ctdKeQe1e}cuhvhwhxhyhzhAhBhChDhEhFhGh%fFeGdAeGeudjcNc'fSe~cEe(fHhBeHe:d[d]d;d=d*h2e3epdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd
902 self._memory_resource = None 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V /g:g;gmhVe]gWeXe^g_gnh`gW X Y Z 0 1 ohphqh+ , - . )b*b+b,b-b.b/b4e5e6e2 3 4 7e8e9e' OhUbPh6bQh5 6 7 Rhn Sh8 ThUhVh( Wh9 Xh7bYhk l m ! 8bZh9b0h!b1h#b2h3h4h5h6h7h8h9h!h1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb=b3b@h[h]h^h_hrh{d`hiiic{hji|hkiZb}h~h4b5bZe0eJgKgLgMbPbQbDbEbSbTbFbGbsh#fihMg$fth?bYe[f]f'bNeCesd)cbdmcEdIecdo p (b# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@d^f_f|ctdKeQe1e}cuhvhwhxhyhzhAhBhChDhEhFhGh%fFeGdAeGeudjcNc'fSe~cEe(fHhBeHe:d[d]d;d=d*h2e3epdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd
903 self._ipc_data = None 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V /g:g;gmhVe]gWeXe^g_gnh`gW X Y Z 0 1 ohphqh+ , - . )b*b+b,b-b.b/b4e5e6e2 3 4 7e8e9e' OhUbPh6bQh5 6 7 Rhn Sh8 ThUhVh( Wh9 Xh7bYhk l m ! 8bZh9b0h!b1h#b2h3h4h5h6h7h8h9h!h1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb=b3b@h[h]h^h_hrh{d`hiiic{hji|hkiZb}h~h4b5bZe0eJgKgLgMbPbQbDbEbSbTbFbGbsh#fihMg$fth?bYe[f]f'bNeCesd)cbdmcEdIecdo p (b# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@d^f_f|ctdKeQe1e}cuhvhwhxhyhzhAhBhChDhEhFhGh%fFeGdAeGeudjcNc'fSe~cEe(fHhBeHe:d[d]d;d=d*h2e3epdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd
904 self._owner = None 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V /g:g;gmhVe]gWeXe^g_gnh`gW X Y Z 0 1 ohphqh+ , - . )b*b+b,b-b.b/b4e5e6e2 3 4 7e8e9e' OhUbPh6bQh5 6 7 Rhn Sh8 ThUhVh( Wh9 Xh7bYhk l m ! 8bZh9b0h!b1h#b2h3h4h5h6h7h8h9h!h1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb=b3b@h[h]h^h_hrh{d`hiiic{hji|hkiZb}h~h4b5bZe0eJgKgLgMbPbQbDbEbSbTbFbGbsh#fihMg$fth?bYe[f]f'bNeCesd)cbdmcEdIecdo p (b# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@d^f_f|ctdKeQe1e}cuhvhwhxhyhzhAhBhChDhEhFhGh%fFeGdAeGeudjcNc'fSe~cEe(fHhBeHe:d[d]d;d=d*h2e3epdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd
905 self._mem_attrs_inited.store(False) 2q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V /g:g;gmhVe]gWeXe^g_gnh`gW X Y Z 0 1 ohphqh+ , - . )b*b+b,b-b.b/b4e5e6e2 3 4 7e8e9e' OhUbPh6bQh5 6 7 Rhn Sh8 ThUhVh( Wh9 Xh7bYhk l m ! 8bZh9b0h!b1h#b2h3h4h5h6h7h8h9h!h1b2bccdcecg VbHbh i $bj WbkcIbhc[b:blcJbRbXbYbKbLb=b3b@h[h]h^h_hrh{d`hiiic{hji|hkiZb}h~h4b5bZe0eJgKgLgMbPbQbDbEbSbTbFbGbsh#fihMg$fth?bYe[f]f'bNeCesd)cbdmcEdIecdo p (b# $ NbOb~dae*cddPcbeedQc+ccedeeeRcfe,c-c.cScTcUcVcWcXcge/c:cYcZcfd0c1cgdheieje2chdnckeidoc3clemenepcoe4c5c6cqcrcsctcucvcpe7c8cwcxcjdyczckdqerese9cldActemdBc!cueveweCcxe#c$c%cDcEcFcGcHcIcye'c(cJcKcndLcMcodzeadFdDd@d^f_f|ctdKeQe1e}cuhvhwhxhyhzhAhBhChDhEhFhGh%fFeGdAeGeudjcNc'fSe~cEe(fHhBeHe:d[d]d;d=d*h2e3epdvdwdHdxdydzdAdIdJdKdBdLdCdqdrd