Walter White <[email protected]> writes:

> Hello,
>
> I have a question about pinned memory and hope that you can help me.
>
> I found out that copying data from device to host takes
> a very big part of my runtime, so I read about the issue
> and came across "pinned memory".
>
> There are several examples on the mailing list but I am not
> sure if I am doing this the right way.
>
> Do I need to initialize with drv.ctx_flags.MAP_HOST
> or is this automatically activated if one of the
> functions below is used?
>
> drv.init()
> dev = drv.Device(0)
> ctx = dev.make_context(drv.ctx_flags.SCHED_AUTO | drv.ctx_flags.MAP_HOST)

No, this is necessary.

> Is drv.mem_host_register_flags.DEVICEMAP also needed if
> the context is initialized with drv.ctx_flags.MAP_HOST ?
>
> I found several methods that should do this
> but none of them seems to work.
> Are they all equivalent?
>
> --
> x = drv.register_host_memory(x, flags=drv.mem_host_register_flags.DEVICEMAP)
> x_gpu_ptr = np.intp(x.base.get_device_pointer())
>
> --
> x = drv.pagelocked_empty(shape=x.shape, dtype=np.float32,
> mem_flags=drv.mem_host_register_flags.DEVICEMAP)
> --
>
> from pycuda.tools import PageLockedMemoryPool
> pool = PageLockedMemoryPool()
> x_ptr = pool.allocate(dest.shape , np.float32)
> --

The former two are equivalent. The latter just uses 'page-locked' memory
(which *can* be pinned, but normally isn't).

> If I use
> np.intp(x.base.get_device_pointer())
> and
> drv.memcpy_dtoh(a_gpu, x_ptr)
>
> there is an error message
>
> "BufferError: Object is not writable."

This is a sign that it worked--the memory is no longer writable host-side.

Andreas

_______________________________________________
PyCUDA mailing list
[email protected]
http://lists.tiker.net/listinfo/pycuda

Reply via email to