Source code for nabu.opencl.processing
from ..processing.processing_base import ProcessingBase
from ..utils import MissingComponentError
from .utils import get_opencl_context, __has_pyopencl__
if __has_pyopencl__:
from .kernel import OpenCLKernel
import pyopencl as cl
import pyopencl.array as parray
from pyopencl.tools import dtype_to_ctype
OpenCLArray = parray.Array
else:
OpenCLArray = MissingComponentError("pyopencl")
dtype_to_ctype = MissingComponentError("pyopencl")
[docs]
class OpenCLProcessing(ProcessingBase):
array_class = OpenCLArray
dtype_to_ctype = dtype_to_ctype
def __init__(self, ctx=None, device_type="all", queue=None, profile=False, **kwargs):
"""
Initialie a OpenCLProcessing instance.
Parameters
----------
ctx: pycuda.driver.Context, optional
Existing context to use. If provided, do not create a new context.
cleanup_at_exit: bool, optional
Whether to clean-up the context at exit.
Ignored if ctx is not None.
"""
super().__init__()
if queue is not None:
# re-use an existing queue. In this case the this instance is mostly for convenience
ctx = queue.context
if ctx is None:
self.ctx = get_opencl_context(device_type=device_type, **kwargs)
else:
self.ctx = ctx
if queue is None:
queue_init_kwargs = {}
if profile:
queue_init_kwargs = {"properties": cl.command_queue_properties.PROFILING_ENABLE}
queue = cl.CommandQueue(self.ctx, **queue_init_kwargs)
self.queue = queue
# TODO push_context, pop_context ?
def _allocate_array_mem(self, shape, dtype):
return parray.zeros(self.queue, shape, dtype)
[docs]
def kernel(self, kernel_name, filename=None, src=None, automation_params=None, **build_kwargs):
return OpenCLKernel(
kernel_name,
None,
queue=self.queue,
filename=filename,
src=src,
automation_params=automation_params,
**build_kwargs,
)