def __call__(self, *args): """__call__ :param *args: """ if isinstance(args[0], hmarray): output = empty_like(args[0]) else: output = np.zeros_like(args[0]) # self.kernel.argtypes = tuple( # cl_mem for _ in args + (output, ) # ) + (localmem, ) buffers = [] events = [] for index, arg in enumerate(args + (output, )): if isinstance(arg, hmarray): buffers.append(arg.ocl_buf) else: buf, evt = buffer_from_ndarray(self.queue, arg, blocking=True) # evt.wait() events.append(evt) buffers.append(buf) # self.kernel.setarg(index, buf, sizeof(cl_mem)) cl.clWaitForEvents(*events) cl_error = 0 if isinstance(self.kernel, list): kernels = len(self.kernel) if kernels == 2: cl_error = self._c_function(self.queue, self.kernel[0], self.kernel[1], *buffers) elif kernels == 3: cl_error = self._c_function(self.queue, self.kernel[0], self.kernel[1], self.kernel[2], *buffers) elif kernels == 4: cl_error = self._c_function( self.queue, self.kernel[0], self.kernel[1], self.kernel[2], self.kernel[3], *buffers ) else: cl_error = self._c_function(self.queue, self.kernel, *buffers) if cl.cl_errnum(cl_error) != cl.cl_errnum.CL_SUCCESS: raise StencilException( "Error executing stencil kernel: opencl {} {}".format( cl_error, cl.cl_errnum(cl_error) ) ) if isinstance(output, hmarray): return output buf, evt = buffer_to_ndarray( self.queue, buffers[-1], output ) evt.wait() return buf
def get_placeholder_output(self, args): return empty_like(args[0])