'Run the kernel.
Parameters
inputs : list of NDArray
List of inputs. Can contain different NDArrays than those used for the constructor,
but its elements must have the same shapes and appear in the same order.
outputs : list of NDArray
List of outputs. Can contain different ndarrays than used for the constructor,
but must have the same shapes and appear in the same order.
grid_dims : tuple of 3 uint
Grid dimension for kernel launch.
block_dims : tuple of 3 uint
Block dimension for kernel launch.'

def push(self, inputs, outputs, grid_dims, block_dims):

    input_nds = ctypes.cast(c_array(NDArrayHandle, [i.handle for i in inputs]), ctypes.POINTER(NDArrayHandle))
    output_nds = ctypes.cast(c_array(NDArrayHandle, [i.handle for i in outputs]), ctypes.POINTER(NDArrayHandle))
    check_call(_LIB.MXRtcPush(self.handle, mx_uint(len(inputs)), mx_uint(len(outputs)), input_nds, output_nds, mx_uint(grid_dims[0]), mx_uint(grid_dims[1]), mx_uint(grid_dims[2]), mx_uint(block_dims[0]), mx_uint(block_dims[1]), mx_uint(block_dims[2])))
