diff --git a/pycuda/compyte b/pycuda/compyte index d1f993daecc03947d9e6e3e60d2a5145ecbf3786..fbfe788a2dcb190fd241fd42ad047e33bafd85b8 160000 --- a/pycuda/compyte +++ b/pycuda/compyte @@ -1 +1 @@ -Subproject commit d1f993daecc03947d9e6e3e60d2a5145ecbf3786 +Subproject commit fbfe788a2dcb190fd241fd42ad047e33bafd85b8 diff --git a/src/cpp/cuda.hpp b/src/cpp/cuda.hpp index 78f49a7a96213f9bf2f21512a4245c92c6de7094..e3f8ef24b32189231df50ee86abcfc7cac444ec2 100644 --- a/src/cpp/cuda.hpp +++ b/src/cpp/cuda.hpp @@ -1530,9 +1530,9 @@ namespace pycuda { public: virtual ~pointer_holder_base() { } - virtual CUdeviceptr get_pointer() = 0; + virtual CUdeviceptr get_pointer() const = 0; - operator CUdeviceptr() + operator CUdeviceptr() const { return get_pointer(); } py::object as_buffer(size_t size, size_t offset) diff --git a/src/wrapper/wrap_cudadrv.cpp b/src/wrapper/wrap_cudadrv.cpp index a27b836e3e7071777690303b1736e41f173d8f81..7c513a1af7ecd7f2268547716f40024f7434da6c 100644 --- a/src/wrapper/wrap_cudadrv.cpp +++ b/src/wrapper/wrap_cudadrv.cpp @@ -109,7 +109,7 @@ namespace public py::wrapper { public: - CUdeviceptr get_pointer() + CUdeviceptr get_pointer() const { return this->get_override("get_pointer")(); } @@ -260,7 +260,7 @@ namespace py_buffer_wrapper buf_wrapper; buf_wrapper.get(dest.ptr(), PyBUF_ANY_CONTIGUOUS | PyBUF_WRITABLE); - CUDAPP_CALL_GUARDED_THREADED(cuMemcpyAtoH, + CUDAPP_CALL_GUARDED_THREADED(cuMemcpyAtoH, (buf_wrapper.m_buf.buf, ary.handle(), index, buf_wrapper.m_buf.len)); } @@ -1271,6 +1271,9 @@ BOOST_PYTHON_MODULE(_driver) .def("get_pointer", py::pure_virtual(&cl::get_pointer)) .def("as_buffer", &cl::as_buffer, (py::arg("size"), py::arg("offset")=0)) + .def("__int__", &cl::operator CUdeviceptr) + .def("__long__", mem_obj_to_long) + .def("__index__", mem_obj_to_long) ; py::implicitly_convertible(); @@ -1280,8 +1283,8 @@ BOOST_PYTHON_MODULE(_driver) typedef device_allocation cl; py::class_("DeviceAllocation", py::no_init) .def("__int__", &cl::operator CUdeviceptr) - .def("__long__", mem_obj_to_long) - .def("__index__", mem_obj_to_long) + .def("__long__", mem_obj_to_long) + .def("__index__", mem_obj_to_long) .def("as_buffer", &cl::as_buffer, (py::arg("size"), py::arg("offset")=0)) .DEF_SIMPLE_METHOD(free) @@ -1296,7 +1299,8 @@ BOOST_PYTHON_MODULE(_driver) py::class_("IPCMemoryHandle", py::init >()) .def("__int__", &cl::operator CUdeviceptr) - .def("__long__", mem_obj_to_long) + .def("__long__", mem_obj_to_long) + .def("__index__", mem_obj_to_long) .DEF_SIMPLE_METHOD(close) ; @@ -1352,7 +1356,7 @@ BOOST_PYTHON_MODULE(_driver) wrp .DEF_SIMPLE_METHOD(get_device_pointer) - .def("attach", &cl::attach, + .def("attach", &cl::attach, (py::arg("mem_flags"), py::arg("stream")=py::object())) ; } diff --git a/test/test_driver.py b/test/test_driver.py index 0c074efe05e93bd4a39ac20a22ed86586bf1a53a..c720cebf1ac7c9d9de8928f6213e948e0411a354 100644 --- a/test/test_driver.py +++ b/test/test_driver.py @@ -1039,6 +1039,21 @@ class TestDriver: test_kernel(grid=(2, 1), block=(1, 1, 1)) +class WrappedAllocation(drv.PointerHolderBase): + def __init__(self, wrapped): + self.wrapped = wrapped + super().__init__() + + def get_pointer(self): + return int(self.wrapped) + + +def test_pointer_holder_base(): + alloc = WrappedAllocation(drv.mem_alloc(1024)) + ary = gpuarray.GPUArray((1024,), np.uint8, gpudata=alloc) + print(ary.get()) + + def test_import_pyopencl_before_pycuda(): try: import pyopencl # noqa