Source code for nabu.opencl.memcpy
import numpy as np
from ..utils import get_opencl_srcfile
from .kernel import OpenCLKernel
from .processing import OpenCLProcessing
[docs]
class OpenCLMemcpy2D(OpenCLProcessing):
"""
A class for performing rectangular memory copies between pyopencl arrays.
It will only work for float32 arrays!
It was written as pyopencl.enqueue_copy is too cumbersome to use for buffers.
"""
def __init__(self, ctx=None, device_type="GPU", queue=None, **kwargs):
super().__init__(ctx=ctx, device_type=device_type, queue=queue, **kwargs)
self.memcpy2D = OpenCLKernel("cpy2d", self.ctx, filename=get_opencl_srcfile("ElementOp.cl"))
def __call__(self, dst, src, transfer_shape_xy, dst_offset_xy=None, src_offset_xy=None, wait=True):
if dst_offset_xy is None:
dst_offset_xy = (0, 0)
if src_offset_xy is None:
src_offset_xy = (0, 0)
evt = self.memcpy2D(
self.queue,
dst,
src,
np.int32(dst.shape[-1]),
np.int32(src.shape[-1]),
np.int32(dst_offset_xy),
np.int32(src_offset_xy),
np.int32(transfer_shape_xy),
global_size=transfer_shape_xy,
)
if wait:
evt.wait()