Esempio n. 1
0
def dpnp_full_like_impl(a, b):
    name = "full_like"
    dpnp_lowering.ensure_dpnp(name)

    ret_type = types.void
    """
    dpnp source:
    https://github.com/IntelPython/dpnp/blob/0.5.1/dpnp/backend/kernels/dpnp_krnl_common.cpp#L224

    Function declaration:
    void dpnp_initval_c(void* result1, void* value, size_t size)

    """
    sig = signature(ret_type, types.voidptr, types.voidptr, types.intp)
    dpnp_func = dpnp_ext.dpnp_func("dpnp_" + name, [b.dtype.name, "NONE"], sig)

    res_dtype = b.dtype
    PRINT_DEBUG = dpnp_lowering.DEBUG

    def dpnp_impl(a, b):
        out = np.ones(a.shape, dtype=res_dtype)
        common_impl(a, b, out, dpnp_func, PRINT_DEBUG)
        return out

    return dpnp_impl
def dpnp_cumprod_impl(a):
    name = "cumprod"
    dpnp_lowering.ensure_dpnp(name)

    res_type = types.void
    """
    dpnp source:
    https://github.com/IntelPython/dpnp/blob/0.5.1/dpnp/backend/kernels/dpnp_krnl_mathematical.cpp#L110
    Function declaration:
    void dpnp_cumprod_c(void* array1_in, void* result1, size_t size)
    """
    sig = signature(res_type, types.voidptr, types.voidptr, types.intp)
    dpnp_func = dpnp_ext.dpnp_func("dpnp_" + name, [a.dtype.name, "NONE"], sig)

    PRINT_DEBUG = dpnp_lowering.DEBUG
    if a.dtype == types.Integer:
        ret_dtype = np.int64
    else:
        ret_dtype = a.dtype

    def dpnp_impl(a):
        out = np.arange(0, a.size, 1, ret_dtype)
        common_impl(a, out, dpnp_func, PRINT_DEBUG)

        return out

    return dpnp_impl
Esempio n. 3
0
def dpnp_trace_impl(a):
    name = "trace"
    dpnp_lowering.ensure_dpnp(name)

    ret_type = types.void
    """
    dpnp source:
    https://github.com/IntelPython/dpnp/blob/0.6.2/dpnp/backend/kernels/dpnp_krnl_arraycreation.cpp#L218

    Function declaration:
    void dpnp_trace_c(const void* array1_in, void* result1, const size_t* shape_, const size_t ndim)

    """
    sig = signature(ret_type, types.voidptr, types.voidptr, types.voidptr,
                    types.intp)
    dpnp_func = dpnp_ext.dpnp_func("dpnp_" + name, [a.dtype.name, "NONE"], sig)

    PRINT_DEBUG = dpnp_lowering.DEBUG

    def dpnp_impl(a):
        diag_arr = numba_dppy.dpnp.diagonal(a, 0)
        out = np.zeros(diag_arr.shape[:-1], dtype=a.dtype)
        common_shape_impl(diag_arr, out, dpnp_func, PRINT_DEBUG)
        return out

    return dpnp_impl
Esempio n. 4
0
def dpnp_det_impl(a):
    name = "det"
    dpnp_lowering.ensure_dpnp(name)

    ret_type = types.void
    """
    dpnp source:
    https://github.com/IntelPython/dpnp/blob/0.4.0/dpnp/backend/custom_kernels_linalg.cpp#L83

    Function declaration:
    void custom_det_c(void* array1_in, void* result1, size_t* shape, size_t ndim)
    """
    sig = signature(ret_type, types.voidptr, types.voidptr, types.voidptr,
                    types.intp)
    dpnp_func = dpnp_ext.dpnp_func("dpnp_" + name, [a.dtype.name, "NONE"], sig)
    PRINT_DEBUG = dpnp_lowering.DEBUG

    def dpnp_impl(a):
        n = a.shape[-1]
        if a.shape[-2] != n:
            raise ValueError("Input array must be square.")

        dpnp_ext._check_finite_matrix(a)

        if a.ndim == 2:
            out = np.empty((1, ), dtype=a.dtype)
            out[0] = -4
        else:
            out = np.empty(a.shape[:-2], dtype=a.dtype)

        sycl_queue = dpctl_functions.get_current_queue()
        a_usm = dpctl_functions.malloc_shared(a.size * a.itemsize, sycl_queue)
        event = dpctl_functions.queue_memcpy(sycl_queue, a_usm, a.ctypes,
                                             a.size * a.itemsize)
        dpctl_functions.event_wait(event)
        dpctl_functions.event_delete(event)

        out_usm = dpctl_functions.malloc_shared(out.size * out.itemsize,
                                                sycl_queue)

        dpnp_func(a_usm, out_usm, a.shapeptr, a.ndim)

        event = dpctl_functions.queue_memcpy(sycl_queue, out.ctypes, out_usm,
                                             out.size * out.itemsize)
        dpctl_functions.event_wait(event)
        dpctl_functions.event_delete(event)

        dpctl_functions.free_with_queue(a_usm, sycl_queue)
        dpctl_functions.free_with_queue(out_usm, sycl_queue)

        dpnp_ext._dummy_liveness_func([out.size, a.size])

        if PRINT_DEBUG:
            print("dpnp implementation")
        if a.ndim == 2:
            return out[0]
        else:
            return out

    return dpnp_impl
Esempio n. 5
0
def dpnp_zeros_like_impl(a, dtype=None):
    name = "zeros_like"
    dpnp_lowering.ensure_dpnp(name)

    ret_type = types.void
    """
    dpnp source:
    https://github.com/IntelPython/dpnp/blob/0.5.1/dpnp/backend/kernels/dpnp_krnl_common.cpp#L224

    Function declaration:
    void dpnp_initval_c(void* result1, void* value, size_t size)

    """
    res_dtype = dtype
    if dtype == types.none or dtype is None:
        res_dtype = a.dtype
        name_dtype = res_dtype.name
    else:
        name_dtype = res_dtype.dtype.name

    sig = signature(ret_type, types.voidptr, types.voidptr, types.intp)
    dpnp_func = dpnp_ext.dpnp_func("dpnp_" + name, [name_dtype, "NONE"], sig)

    PRINT_DEBUG = dpnp_lowering.DEBUG

    def dpnp_impl(a, dtype=None):
        b = np.zeros(1, dtype=res_dtype)
        out = np.zeros(a.shape, dtype=res_dtype)
        common_impl(a, b, out, dpnp_func, PRINT_DEBUG)
        return out

    return dpnp_impl
Esempio n. 6
0
def dpnp_matrix_power_impl(a, n):
    dpnp_lowering.ensure_dpnp("matrix_power")
    """
    dpnp source:
    https://github.com/IntelPython/dpnp/blob/0.4.0/dpnp/backend/custom_kernels.cpp#L42

    Function declaration:
    void dpnp_matmul_c(void* array1_in, void* array2_in, void* result1, size_t size_m,
                       size_t size_n, size_t size_k)
    """

    PRINT_DEBUG = dpnp_lowering.DEBUG

    def dpnp_impl(a, n):
        if n < 0:
            raise ValueError(
                "n < 0 is not supported for np.linalg.matrix_power(a, n)")

        if n == 0:
            if PRINT_DEBUG:
                print("dpnp implementation")
            return np.identity(a.shape[0], a.dtype)

        result = a
        for idx in range(0, n - 1):
            result = numba_dppy.dpnp.matmul(result, a)
        return result

    return dpnp_impl
Esempio n. 7
0
def dpnp_random_impl(size=None):
    name = "normal"
    dpnp_lowering.ensure_dpnp("standard_normal")

    ret_type = types.void
    """
    dpnp source:
    https://github.com/IntelPython/dpnp/blob/0.4.0/dpnp/backend/custom_kernels_random.cpp#L282

    Function declaration:
    void custom_rng_normal_c(void* result, _DataType mean, _DataType stddev, size_t size)
    """
    sig = signature(ret_type, types.voidptr, types.float64, types.float64,
                    types.intp)
    dpnp_func = dpnp_ext.dpnp_func("dpnp_" + name, ["float64", "NONE"], sig)
    res_dtype = np.float64
    PRINT_DEBUG = dpnp_lowering.DEBUG

    if size in (None, types.none):

        def dpnp_impl(size=None):
            res = np.empty(1, dtype=res_dtype)
            common_impl(0.0, 1.0, res, dpnp_func, PRINT_DEBUG)
            return res[0]

    else:

        def dpnp_impl(size=None):
            res = np.empty(size, dtype=res_dtype)
            if res.size != 0:
                common_impl(0.0, 1.0, res, dpnp_func, PRINT_DEBUG)
            return res

    return dpnp_impl
Esempio n. 8
0
def dpnp_random_impl(*size):
    name = "random_sample"
    dpnp_lowering.ensure_dpnp(name)

    ret_type = types.void
    """
    dpnp source:
    https://github.com/IntelPython/dpnp/blob/0.4.0/dpnp/backend/custom_kernels_random.cpp#L391

    Function declaration:
    void custom_rng_uniform_c(void* result, long low, long high, size_t size)

    """
    sig = signature(ret_type, types.voidptr, types.int64, types.int64,
                    types.intp)
    dpnp_func = dpnp_ext.dpnp_func("dpnp_" + name, ["float64", "NONE"], sig)

    res_dtype = np.float64

    PRINT_DEBUG = dpnp_lowering.DEBUG

    def dpnp_impl(*size):
        res = np.empty(size, dtype=res_dtype)
        if res.size != 0:
            common_impl(0, 1, res, dpnp_func, PRINT_DEBUG)
        return res

    return dpnp_impl
Esempio n. 9
0
def dpnp_matrix_rank_impl(M, tol=None, hermitian=False):
    name = "matrix_rank"
    dpnp_lowering.ensure_dpnp(name)

    ret_type = types.void
    """
    dpnp source:
    https://github.com/IntelPython/dpnp/blob/0.4.0/dpnp/backend/custom_kernels_linalg.cpp#L186

    Function declaration:
    void custom_matrix_rank_c(void* array1_in, void* result1, size_t* shape, size_t ndim)
    """
    sig = signature(ret_type, types.voidptr, types.voidptr, types.voidptr,
                    types.intp)
    dpnp_func = dpnp_ext.dpnp_func("dpnp_" + name, [M.dtype.name, "NONE"], sig)
    PRINT_DEBUG = dpnp_lowering.DEBUG

    def dpnp_impl(M, tol=None, hermitian=False):
        if tol is not None:
            raise ValueError(
                "tol is not supported for np.linalg.matrix_rank(M)")
        if hermitian:
            raise ValueError(
                "hermitian is not supported for np.linalg.matrix_rank(M)")

        if M.ndim > 2:
            raise ValueError(
                "np.linalg.matrix_rank(M) is only supported on 1 or 2-d arrays"
            )

        out = np.empty(1, dtype=M.dtype)

        sycl_queue = dpctl_functions.get_current_queue()
        M_usm = dpctl_functions.malloc_shared(M.size * M.itemsize, sycl_queue)
        event = dpctl_functions.queue_memcpy(sycl_queue, M_usm, M.ctypes,
                                             M.size * M.itemsize)
        dpctl_functions.event_wait(event)
        dpctl_functions.event_delete(event)

        out_usm = dpctl_functions.malloc_shared(out.size * out.itemsize,
                                                sycl_queue)

        dpnp_func(M_usm, out_usm, M.shapeptr, M.ndim)

        event = dpctl_functions.queue_memcpy(sycl_queue, out.ctypes, out_usm,
                                             out.size * out.itemsize)
        dpctl_functions.event_wait(event)
        dpctl_functions.event_delete(event)

        dpctl_functions.free_with_queue(M_usm, sycl_queue)
        dpctl_functions.free_with_queue(out_usm, sycl_queue)

        dpnp_ext._dummy_liveness_func([out.size, M.size])

        if PRINT_DEBUG:
            print("dpnp implementation")
        return out[0]

    return dpnp_impl
Esempio n. 10
0
def dpnp_eigvals_impl(a):
    dpnp_lowering.ensure_dpnp("eigvals")

    def dpnp_impl(a):
        eigval, eigvec = numba_dppy.dpnp.eig(a)
        return eigval

    return dpnp_impl
Esempio n. 11
0
def dpnp_random_impl(low, high=None, size=None):
    name = "random_sample"
    dpnp_lowering.ensure_dpnp("random_integers")

    ret_type = types.void
    """
    dpnp source:
    https://github.com/IntelPython/dpnp/blob/0.4.0/dpnp/backend/custom_kernels_random.cpp#L391

    Function declaration:
    void custom_rng_uniform_c(void* result, long low, long high, size_t size)

    """
    sig = signature(ret_type, types.voidptr, types.int64, types.int64,
                    types.intp)
    dpnp_func = dpnp_ext.dpnp_func("dpnp_" + name, ["int32", "NONE"], sig)

    res_dtype = np.int32

    PRINT_DEBUG = dpnp_lowering.DEBUG

    if size in (None, types.none):
        if high not in (None, types.none):

            def dpnp_impl(low, high=None, size=None):
                res = np.empty(1, dtype=res_dtype)
                common_impl(low, high + 1, res, dpnp_func, PRINT_DEBUG)
                return res

        else:

            def dpnp_impl(low, high=None, size=None):
                res = np.empty(1, dtype=res_dtype)
                common_impl(1, low + 1, res, dpnp_func, PRINT_DEBUG)
                return res

    else:
        if high not in (None, types.none):

            def dpnp_impl(low, high=None, size=None):
                res = np.empty(size, dtype=res_dtype)
                if res.size != 0:
                    common_impl(low, high + 1, res, dpnp_func, PRINT_DEBUG)
                return res

        else:

            def dpnp_impl(low, high=None, size=None):
                res = np.empty(size, dtype=res_dtype)
                if res.size != 0:
                    common_impl(1, low + 1, res, dpnp_func, PRINT_DEBUG)
                return res

    return dpnp_impl
Esempio n. 12
0
def dpnp_random_impl(ngood, nbad, nsample, size=None):
    name = "hypergeometric"
    dpnp_lowering.ensure_dpnp(name)

    ret_type = types.void
    """
    dpnp source:
    https://github.com/IntelPython/dpnp/blob/0.4.0/dpnp/backend/custom_kernels_random.cpp#L169

    Function declaration:
    void custom_rng_hypergeometric_c(void* result, int l, int s, int m, size_t size)
    """
    sig = signature(
        ret_type,
        types.voidptr,
        types.int32,
        types.int32,
        types.int32,
        types.intp,
    )
    dpnp_func = dpnp_ext.dpnp_func("dpnp_" + name, ["int32", "NONE"], sig)

    res_dtype = np.int32

    PRINT_DEBUG = dpnp_lowering.DEBUG

    if not (isinstance(ngood, types.Integer)):
        raise ValueError("We only support scalar for input: ngood")

    if not (isinstance(nbad, types.Integer)):
        raise ValueError("We only support scalar for input: nbad")

    if not (isinstance(nsample, types.Integer)):
        raise ValueError("We only support scalar for input: nsample")

    if size in (None, types.none):

        def dpnp_impl(ngood, nbad, nsample, size=None):
            res = np.empty(1, dtype=res_dtype)
            common_impl_hypergeometric(ngood, nbad, nsample, res, dpnp_func,
                                       PRINT_DEBUG)
            return res[0]

    else:

        def dpnp_impl(ngood, nbad, nsample, size=None):
            res = np.empty(size, dtype=res_dtype)
            if res.size != 0:
                common_impl_hypergeometric(ngood, nbad, nsample, res,
                                           dpnp_func, PRINT_DEBUG)
            return res

    return dpnp_impl
Esempio n. 13
0
def dpnp_all_impl(a):
    name = "all"
    dpnp_lowering.ensure_dpnp(name)

    ret_type = types.void
    """
    dpnp source:
    https://github.com/IntelPython/dpnp/blob/0.6.2/dpnp/backend/kernels/dpnp_krnl_logic.cpp#L36
    Function declaration:
    void dpnp_all_c(const void* array1_in, void* result1, const size_t size)
    """
    sig = signature(ret_type, types.voidptr, types.voidptr, types.intp)
    dpnp_func = dpnp_ext.dpnp_func("dpnp_" + name, [a.dtype.name, "NONE"], sig)

    PRINT_DEBUG = dpnp_lowering.DEBUG

    def dpnp_impl(a):
        if a.size == 0:
            return True

        out = np.empty(1, dtype=np.bool_)

        sycl_queue = dpctl_functions.get_current_queue()

        a_usm = dpctl_functions.malloc_shared(a.size * a.itemsize, sycl_queue)
        event = dpctl_functions.queue_memcpy(sycl_queue, a_usm, a.ctypes,
                                             a.size * a.itemsize)
        dpctl_functions.event_wait(event)
        dpctl_functions.event_delete(event)

        out_usm = dpctl_functions.malloc_shared(out.size * out.itemsize,
                                                sycl_queue)

        dpnp_func(a_usm, out_usm, a.size)

        event = dpctl_functions.queue_memcpy(sycl_queue, out.ctypes, out_usm,
                                             out.size * out.itemsize)
        dpctl_functions.event_wait(event)
        dpctl_functions.event_delete(event)

        dpctl_functions.free_with_queue(a_usm, sycl_queue)
        dpctl_functions.free_with_queue(out_usm, sycl_queue)

        dpnp_ext._dummy_liveness_func([a.size, out.size])

        if PRINT_DEBUG:
            print("dpnp implementation")

        # TODO: sometimes all() returns ndarray
        return out[0]

    return dpnp_impl
Esempio n. 14
0
def dpnp_full_impl(a, b):
    name = "full"
    dpnp_lowering.ensure_dpnp(name)

    ret_type = types.void
    """
    dpnp source:
    https://github.com/IntelPython/dpnp/blob/0.5.1/dpnp/backend/kernels/dpnp_krnl_arraycreation.cpp#L70

    Function declaration:
    void dpnp_full_c(void* array_in, void* result, const size_t size)

    """
    sig = signature(ret_type, types.voidptr, types.voidptr, types.intp)
    dpnp_func = dpnp_ext.dpnp_func("dpnp_" + name, [b.dtype.name, "NONE"], sig)

    res_dtype = b.dtype
    PRINT_DEBUG = dpnp_lowering.DEBUG

    def dpnp_impl(a, b):
        if a.size == 0:
            raise ValueError("Passed Empty array")

        sycl_queue = dpctl_functions.get_current_queue()

        b_usm = dpctl_functions.malloc_shared(b.size * b.itemsize, sycl_queue)
        event = dpctl_functions.queue_memcpy(sycl_queue, b_usm, b.ctypes,
                                             b.size * b.itemsize)
        dpctl_functions.event_wait(event)
        dpctl_functions.event_delete(event)

        out = np.arange(0, a.size, 1, res_dtype)
        out_usm = dpctl_functions.malloc_shared(out.size * out.itemsize,
                                                sycl_queue)

        dpnp_func(b_usm, out_usm, a.size)

        event = dpctl_functions.queue_memcpy(sycl_queue, out.ctypes, out_usm,
                                             out.size * out.itemsize)
        dpctl_functions.event_wait(event)
        dpctl_functions.event_delete(event)

        dpctl_functions.free_with_queue(b_usm, sycl_queue)
        dpctl_functions.free_with_queue(out_usm, sycl_queue)

        dpnp_ext._dummy_liveness_func([a.size, out.size])

        if PRINT_DEBUG:
            print("dpnp implementation")
        return out

    return dpnp_impl
Esempio n. 15
0
def dpnp_argmin_impl(a):
    name = "argmin"
    dpnp_lowering.ensure_dpnp(name)

    ret_type = types.void
    """
    dpnp source:
    https://github.com/IntelPython/dpnp/blob/0.4.0/dpnp/backend/custom_kernels_searching.cpp#L56

    Function declaration:
    void custom_argmin_c(void* array1_in, void* result1, size_t size)
    """
    sig = signature(ret_type, types.voidptr, types.voidptr, types.intp)
    dpnp_func = dpnp_ext.dpnp_func(
        "dpnp_" + name, [a.dtype.name, np.dtype(np.int64).name], sig)

    res_dtype = np.int64
    PRINT_DEBUG = dpnp_lowering.DEBUG

    def dpnp_impl(a):
        if a.size == 0:
            raise ValueError("Passed Empty array")

        sycl_queue = dpctl_functions.get_current_queue()

        a_usm = dpctl_functions.malloc_shared(a.size * a.itemsize, sycl_queue)
        event = dpctl_functions.queue_memcpy(sycl_queue, a_usm, a.ctypes,
                                             a.size * a.itemsize)
        dpctl_functions.event_wait(event)
        dpctl_functions.event_delete(event)

        out = np.empty(1, dtype=res_dtype)
        out_usm = dpctl_functions.malloc_shared(out.itemsize, sycl_queue)

        dpnp_func(a_usm, out_usm, a.size)

        event = dpctl_functions.queue_memcpy(sycl_queue, out.ctypes, out_usm,
                                             out.size * out.itemsize)
        dpctl_functions.event_wait(event)
        dpctl_functions.event_delete(event)

        dpctl_functions.free_with_queue(a_usm, sycl_queue)
        dpctl_functions.free_with_queue(out_usm, sycl_queue)

        dpnp_ext._dummy_liveness_func([a.size, out.size])

        if PRINT_DEBUG:
            print("dpnp implementation")
        return out[0]

    return dpnp_impl
Esempio n. 16
0
def dpnp_vdot_impl(a, b):
    dpnp_lowering.ensure_dpnp("vdot")
    """
    dpnp source:
    https://github.com/IntelPython/dpnp/blob/0.4.0/dpnp/backend/custom_kernels.cpp#L118

    Function declaration:
    void dpnp_dot_c(void* array1_in, void* array2_in, void* result1, size_t size)

    """
    def dpnp_impl(a, b):
        return numba_dppy.dpnp.dot(np.ravel(a), np.ravel(b))

    return dpnp_impl
Esempio n. 17
0
def dpnp_sum_impl(a):
    name = "sum"
    dpnp_lowering.ensure_dpnp(name)

    ret_type = types.void
    """
    dpnp source:
    https://github.com/IntelPython/dpnp/blob/0.6.1dev/dpnp/backend/kernels/dpnp_krnl_reduction.cpp#L59

    Function declaration:
    void dpnp_sum_c(void* result_out,
                    const void* input_in,
                    const size_t* input_shape,
                    const size_t input_shape_ndim,
                    const long* axes,
                    const size_t axes_ndim,
                    const void* initial,
                    const long* where)

    """
    sig = signature(
        ret_type,
        types.voidptr,  # void* result_out,
        types.voidptr,  # const void* input_in,
        types.voidptr,  # const size_t* input_shape,
        types.intp,  # const size_t input_shape_ndim,
        types.voidptr,  # const long* axes,
        types.intp,  # const size_t axes_ndim,
        types.voidptr,  # const void* initial,
        types.voidptr,  # const long* where)
    )
    dpnp_func = dpnp_ext.dpnp_func("dpnp_" + name, [a.dtype.name, "NONE"], sig)

    PRINT_DEBUG = dpnp_lowering.DEBUG

    def dpnp_impl(a):
        out = np.empty(1, dtype=a.dtype)
        common_impl(a, out, dpnp_func, PRINT_DEBUG)

        return out[0]

    return dpnp_impl
Esempio n. 18
0
def dpnp_random_impl(mean=0.0, sigma=1.0, size=None):
    name = "lognormal"
    dpnp_lowering.ensure_dpnp(name)

    ret_type = types.void
    """
    dpnp source:
    https://github.com/IntelPython/dpnp/blob/0.4.0/dpnp/backend/custom_kernels_random.cpp#L199

    Function declaration:
    void custom_rng_lognormal_c(void* result, _DataType mean, _DataType stddev, size_t size)
    """
    sig = signature(ret_type, types.voidptr, types.float64, types.float64,
                    types.intp)
    dpnp_func = dpnp_ext.dpnp_func("dpnp_" + name, ["float64", "NONE"], sig)
    res_dtype = np.float64
    PRINT_DEBUG = dpnp_lowering.DEBUG

    if not isinstance(mean, float):
        if not (isinstance(mean, types.Float)):
            raise ValueError("We only support scalar for input: loc")

    if not isinstance(sigma, float):
        if not (isinstance(sigma, types.Float)):
            raise ValueError("We only support scalar for input: scale")

    if size in (None, types.none):

        def dpnp_impl(mean=0.0, sigma=1.0, size=None):
            res = np.empty(1, dtype=res_dtype)
            common_impl_2_arg(mean, sigma, res, dpnp_func, PRINT_DEBUG)
            return res[0]

    else:

        def dpnp_impl(mean=0.0, sigma=1.0, size=None):
            res = np.empty(size, dtype=res_dtype)
            if res.size != 0:
                common_impl_2_arg(mean, sigma, res, dpnp_func, PRINT_DEBUG)
            return res

    return dpnp_impl
Esempio n. 19
0
def dpnp_random_impl(n, p, size=None):
    name = "binomial"
    dpnp_lowering.ensure_dpnp(name)

    ret_type = types.void
    """
    dpnp source:
    https://github.com/IntelPython/dpnp/blob/0.4.0/dpnp/backend/custom_kernels_random.cpp#L56

    Function declaration:
    void custom_rng_binomial_c(void* result, int ntrial, double p, size_t size)

    """
    sig = signature(ret_type, types.voidptr, types.int32, types.float64,
                    types.intp)
    dpnp_func = dpnp_ext.dpnp_func("dpnp_" + name, ["int32", "NONE"], sig)
    res_dtype = np.int32
    PRINT_DEBUG = dpnp_lowering.DEBUG

    if not (isinstance(n, types.Integer)):
        raise ValueError("We only support scalar for input: n")

    if not (isinstance(p, types.Float)):
        raise ValueError("We only support scalar for input: p")

    if size in (None, types.none):

        def dpnp_impl(n, p, size=None):
            res = np.empty(1, dtype=res_dtype)
            common_impl_2_arg(n, p, res, dpnp_func, PRINT_DEBUG)
            return res[0]

    else:

        def dpnp_impl(n, p, size=None):
            res = np.empty(size, dtype=res_dtype)
            if res.size != 0:
                common_impl_2_arg(n, p, res, dpnp_func, PRINT_DEBUG)
            return res

    return dpnp_impl
Esempio n. 20
0
def dpnp_nanprod_impl(a):
    name = "nanprod"
    dpnp_lowering.ensure_dpnp(name)

    PRINT_DEBUG = dpnp_lowering.DEBUG

    def dpnp_impl(a):
        a_ravel = a.ravel()
        a_ravel_copy = np.copy(a_ravel)

        for i in range(len(a_ravel_copy)):
            if np.isnan(a_ravel_copy[i]):
                a_ravel_copy[i] = 1

        result = numba_dppy.dpnp.prod(a_ravel_copy)
        dpnp_ext._dummy_liveness_func([a.size, a_ravel_copy.size])

        if PRINT_DEBUG:
            print("dpnp implementation")

        return result

    return dpnp_impl
Esempio n. 21
0
def dpnp_multi_dot_impl(arrays):
    dpnp_lowering.ensure_dpnp("multi_dot")

    print_debug = dpnp_lowering.DEBUG
    """
    dpnp source:
    https://github.com/IntelPython/dpnp/blob/0.4.0/dpnp/backend/custom_kernels.cpp#L118

    Function declaration:
    void dpnp_dot_c(void* array1_in, void* array2_in, void* result1, size_t size)

    """
    def dpnp_impl(arrays):
        n = len(arrays)
        result = arrays[0]

        for idx in range(1, n):
            result = numba_dppy.dpnp.dot(result, arrays[idx])

        if print_debug:
            print("dpnp implementation")
        return result

    return dpnp_impl
Esempio n. 22
0
def dpnp_random_impl(df, size=None):
    name = "chisquare"
    dpnp_lowering.ensure_dpnp(name)

    ret_type = types.void
    """
    dpnp source:
    https://github.com/IntelPython/dpnp/blob/0.4.0/dpnp/backend/custom_kernels_random.cpp#L71

    Function declaration:
    void custom_rng_chi_square_c(void* result, int df, size_t size)
    """
    sig = signature(ret_type, types.voidptr, types.int32, types.intp)
    dpnp_func = dpnp_ext.dpnp_func("dpnp_" + name, ["float64", "NONE"], sig)
    res_dtype = np.float64
    PRINT_DEBUG = dpnp_lowering.DEBUG

    if not (isinstance(df, types.Integer)):
        raise ValueError("We only support scalar for input: df")

    if size in (None, types.none):

        def dpnp_impl(df, size=None):
            res = np.empty(1, dtype=res_dtype)
            common_impl_1_arg(df, res, dpnp_func, PRINT_DEBUG)
            return res[0]

    else:

        def dpnp_impl(df, size=None):
            res = np.empty(size, dtype=res_dtype)
            if res.size != 0:
                common_impl_1_arg(df, res, dpnp_func, PRINT_DEBUG)
            return res

    return dpnp_impl
Esempio n. 23
0
def dpnp_partition_impl(a, kth):
    name = "partition"
    dpnp_lowering.ensure_dpnp(name)

    ret_type = types.void
    """
    dpnp source:
    https://github.com/IntelPython/dpnp/blob/0.6.2/dpnp/backend/kernels/dpnp_krnl_sorting.cpp#L90
    Function declaration:
    void dpnp_partition_c(
        void* array1_in, void* array2_in, void* result1, const size_t kth, const size_t* shape_, const size_t ndim)
    """
    sig = signature(
        ret_type,
        types.voidptr,
        types.voidptr,
        types.voidptr,
        types.intp,
        types.voidptr,
        types.intp,
    )
    dpnp_func = dpnp_ext.dpnp_func("dpnp_" + name, [a.dtype.name, "NONE"], sig)

    PRINT_DEBUG = dpnp_lowering.DEBUG

    def dpnp_impl(a, kth):
        if a.size == 0:
            raise ValueError("Passed Empty array")

        kth_ = kth if kth >= 0 else (a.ndim + kth)

        arr2 = numba_dppy.dpnp.copy(a)

        out = np.empty(a.shape, dtype=a.dtype)

        sycl_queue = dpctl_functions.get_current_queue()

        a_usm = dpctl_functions.malloc_shared(a.size * a.itemsize, sycl_queue)
        event = dpctl_functions.queue_memcpy(sycl_queue, a_usm, a.ctypes,
                                             a.size * a.itemsize)
        dpctl_functions.event_wait(event)
        dpctl_functions.event_delete(event)

        arr2_usm = dpctl_functions.malloc_shared(arr2.size * arr2.itemsize,
                                                 sycl_queue)
        event = dpctl_functions.queue_memcpy(sycl_queue, arr2_usm, arr2.ctypes,
                                             arr2.size * arr2.itemsize)
        dpctl_functions.event_wait(event)
        dpctl_functions.event_delete(event)

        out_usm = dpctl_functions.malloc_shared(out.size * out.itemsize,
                                                sycl_queue)

        dpnp_func(a_usm, arr2_usm, out_usm, kth_, a.shapeptr, a.ndim)

        event = dpctl_functions.queue_memcpy(sycl_queue, out.ctypes, out_usm,
                                             out.size * out.itemsize)
        dpctl_functions.event_wait(event)
        dpctl_functions.event_delete(event)

        dpctl_functions.free_with_queue(a_usm, sycl_queue)
        dpctl_functions.free_with_queue(arr2_usm, sycl_queue)
        dpctl_functions.free_with_queue(out_usm, sycl_queue)

        dpnp_ext._dummy_liveness_func([a.size, arr2.size, out.size])

        if PRINT_DEBUG:
            print("dpnp implementation")

        return out

    return dpnp_impl
Esempio n. 24
0
def dpnp_cov_impl(a):
    name = "cov"
    dpnp_lowering.ensure_dpnp(name)

    ret_type = types.void
    """
    dpnp source:
    https://github.com/IntelPython/dpnp/blob/0.4.0/dpnp/backend/custom_kernels_statistics.cpp#L51

    Function declaration:
    void custom_cov_c(void* array1_in, void* result1, size_t nrows, size_t ncols)
    """
    sig = signature(ret_type, types.voidptr, types.voidptr, types.intp,
                    types.intp)
    dpnp_func = dpnp_ext.dpnp_func("dpnp_" + name, [a.dtype.name, "NONE"], sig)

    res_dtype = np.float64
    copy_input_to_double = True
    if a.dtype == types.float64:
        copy_input_to_double = False
    PRINT_DEBUG = dpnp_lowering.DEBUG

    def dpnp_impl(a):
        if a.size == 0:
            raise ValueError("Passed Empty array")

        sycl_queue = dpctl_functions.get_current_queue()
        """ We have to pass a array in double precision to DpNp """
        if copy_input_to_double:
            a_copy_in_double = a.astype(np.float64)
        else:
            a_copy_in_double = a
        a_usm = dpctl_functions.malloc_shared(
            a_copy_in_double.size * a_copy_in_double.itemsize, sycl_queue)
        event = dpctl_functions.queue_memcpy(
            sycl_queue,
            a_usm,
            a_copy_in_double.ctypes,
            a_copy_in_double.size * a_copy_in_double.itemsize,
        )
        dpctl_functions.event_wait(event)
        dpctl_functions.event_delete(event)

        if a.ndim == 2:
            rows = a.shape[0]
            cols = a.shape[1]
            out = np.empty((rows, rows), dtype=res_dtype)
        elif a.ndim == 1:
            rows = 1
            cols = a.shape[0]
            out = np.empty(rows, dtype=res_dtype)

        out_usm = dpctl_functions.malloc_shared(out.size * out.itemsize,
                                                sycl_queue)

        dpnp_func(a_usm, out_usm, rows, cols)

        event = dpctl_functions.queue_memcpy(sycl_queue, out.ctypes, out_usm,
                                             out.size * out.itemsize)
        dpctl_functions.event_wait(event)
        dpctl_functions.event_delete(event)

        dpctl_functions.free_with_queue(a_usm, sycl_queue)
        dpctl_functions.free_with_queue(out_usm, sycl_queue)

        dpnp_ext._dummy_liveness_func(
            [a_copy_in_double.size, a.size, out.size])

        if PRINT_DEBUG:
            print("dpnp implementation")
        if a.ndim == 2:
            return out
        elif a.ndim == 1:
            return out[0]

    return dpnp_impl
Esempio n. 25
0
def dpnp_amin_impl(a):
    name = "min"
    dpnp_lowering.ensure_dpnp(name)

    ret_type = types.void
    """
    dpnp source:
    https://github.com/IntelPython/dpnp/blob/57caae8beb607992f40cdbe00f2666ee84358a97/dpnp/backend/kernels/dpnp_krnl_statistics.cpp#L412

    Function declaration:
    void dpnp_min_c(void* array1_in, void* result1, const size_t result_size, const size_t* shape, size_t ndim, const size_t* axis, size_t naxis)

    We are using void * in case of size_t * as Numba currently does not have
    any type to represent size_t *. Since, both the types are pointers,
    if the compiler allows there should not be any mismatch in the size of
    the container to hold different types of pointer.
    """
    sig = signature(
        ret_type,
        types.voidptr,
        types.voidptr,
        types.intp,
        types.voidptr,
        types.intp,
        types.voidptr,
        types.intp,
    )
    dpnp_func = dpnp_ext.dpnp_func("dpnp_" + name, [a.dtype.name, "NONE"], sig)
    PRINT_DEBUG = dpnp_lowering.DEBUG

    def dpnp_impl(a):
        if a.size == 0:
            raise ValueError("Passed Empty array")

        sycl_queue = dpctl_functions.get_current_queue()

        a_usm = dpctl_functions.malloc_shared(a.size * a.itemsize, sycl_queue)
        event = dpctl_functions.queue_memcpy(sycl_queue, a_usm, a.ctypes,
                                             a.size * a.itemsize)
        dpctl_functions.event_wait(event)
        dpctl_functions.event_delete(event)

        out_usm = dpctl_functions.malloc_shared(a.itemsize, sycl_queue)

        dpnp_func(
            a_usm,
            out_usm,
            a.size * a.itemsize,
            a.shapeptr,
            a.ndim,
            a.shapeptr,
            0,
        )

        out = np.empty(1, dtype=a.dtype)
        event = dpctl_functions.queue_memcpy(sycl_queue, out.ctypes, out_usm,
                                             out.size * out.itemsize)
        dpctl_functions.event_wait(event)
        dpctl_functions.event_delete(event)

        dpctl_functions.free_with_queue(a_usm, sycl_queue)
        dpctl_functions.free_with_queue(out_usm, sycl_queue)

        dpnp_ext._dummy_liveness_func([a.size, out.size])

        if PRINT_DEBUG:
            print("dpnp implementation")
        return out[0]

    return dpnp_impl
Esempio n. 26
0
def dpnp_diagonal_impl(a, offset=0):
    name = "diagonal"
    dpnp_lowering.ensure_dpnp(name)

    ret_type = types.void
    """
    dpnp source:
    https://github.com/IntelPython/dpnp/blob/e389248c709531b181be8bf33b1a270fca812a92/dpnp/backend/kernels/dpnp_krnl_indexing.cpp#L39

    Function declaration:
    void dpnp_diagonal_c(
        void* array1_in, const size_t input1_size, void* result1, const size_t offset, size_t* shape, size_t* res_shape, const size_t res_ndim)

    """
    sig = signature(
        ret_type,
        types.voidptr,
        types.intp,
        types.voidptr,
        types.intp,
        types.voidptr,
        types.voidptr,
        types.intp,
    )
    dpnp_func = dpnp_ext.dpnp_func("dpnp_" + name, [a.dtype.name, "NONE"], sig)

    PRINT_DEBUG = dpnp_lowering.DEBUG

    function_text = f"""\
def tuplizer(a):
    return ({", ".join(f"a[{i}]" for i in range(a.ndim - 1))})
"""
    locals = {}
    exec(function_text, globals(), locals)
    tuplizer = register_jitable(locals["tuplizer"])

    def dpnp_impl(a, offset=0):
        if a.size == 0:
            raise ValueError("Passed Empty array")

        n = min(a.shape[0], a.shape[1])
        res_shape = np.zeros(a.ndim - 1, dtype=np.int64)

        if a.ndim > 2:
            for i in range(a.ndim - 2):
                res_shape[i] = a.shape[i + 2]

        if (n + offset) > a.shape[1]:
            res_shape[-1] = a.shape[1] - offset
        elif (n + offset) > a.shape[0]:
            res_shape[-1] = a.shape[0]
        else:
            res_shape[-1] = n + offset

        shape = tuplizer(res_shape)

        out = np.empty(shape, dtype=a.dtype)

        sycl_queue = dpctl_functions.get_current_queue()

        a_usm = dpctl_functions.malloc_shared(a.size * a.itemsize, sycl_queue)
        event = dpctl_functions.queue_memcpy(
            sycl_queue, a_usm, a.ctypes, a.size * a.itemsize
        )
        dpctl_functions.event_wait(event)
        dpctl_functions.event_delete(event)

        out_usm = dpctl_functions.malloc_shared(
            out.size * out.itemsize, sycl_queue
        )

        dpnp_func(
            a_usm,
            a.size * a.itemsize,
            out_usm,
            offset,
            a.shapeptr,
            out.shapeptr,
            out.ndim,
        )

        event = dpctl_functions.queue_memcpy(
            sycl_queue, out.ctypes, out_usm, out.size * out.itemsize
        )
        dpctl_functions.event_wait(event)
        dpctl_functions.event_delete(event)

        dpctl_functions.free_with_queue(a_usm, sycl_queue)
        dpctl_functions.free_with_queue(out_usm, sycl_queue)

        dpnp_ext._dummy_liveness_func([a.size, out.size])

        if PRINT_DEBUG:
            print("dpnp implementation")

        return out

    return dpnp_impl
Esempio n. 27
0
def dpnp_random_impl(mean, cov, size=None, check_valid="warn", tol=1e-8):
    name = "multivariate_normal"
    dpnp_lowering.ensure_dpnp(name)

    ret_type = types.void
    """
    dpnp source:
    https://github.com/IntelPython/dpnp/blob/0.4.0/dpnp/backend/custom_kernels_random.cpp#L239

    Function declaration:
    void custom_rng_multivariate_normal_c(void* result,
                                      const int dimen,
                                      const double* mean_vector,
                                      const size_t mean_vector_size,
                                      const double* cov_vector,
                                      const size_t cov_vector_size,
                                      size_t size)
    """
    sig = signature(
        ret_type,
        types.voidptr,
        types.int32,
        types.voidptr,
        types.intp,
        types.voidptr,
        types.intp,
        types.intp,
    )
    dpnp_func = dpnp_ext.dpnp_func("dpnp_" + name, ["float64", "NONE"], sig)

    res_dtype = np.float64

    PRINT_DEBUG = dpnp_lowering.DEBUG

    if size in (None, types.none):

        def dpnp_impl(mean, cov, size=None, check_valid="warn", tol=1e-8):
            out = np.empty(mean.shape, dtype=res_dtype)
            common_impl_multivariate_normal(mean, cov, size, check_valid, tol,
                                            out, dpnp_func, PRINT_DEBUG)
            return out

    elif isinstance(size, types.Integer):

        def dpnp_impl(mean, cov, size=None, check_valid="warn", tol=1e-8):
            new_size = (size, )
            new_size = new_size + (mean.size, )
            out = np.empty(new_size, dtype=res_dtype)
            common_impl_multivariate_normal(mean, cov, size, check_valid, tol,
                                            out, dpnp_func, PRINT_DEBUG)
            return out

    elif isinstance(size, types.BaseTuple):

        def dpnp_impl(mean, cov, size=None, check_valid="warn", tol=1e-8):
            new_size = size + (mean.size, )
            out = np.empty(new_size, dtype=res_dtype)
            common_impl_multivariate_normal(mean, cov, size, check_valid, tol,
                                            out, dpnp_func, PRINT_DEBUG)
            return out

    else:
        raise TypeError(
            "np.random.multivariate_normal(): size should be int or "
            "tuple or None, got %s" % (size, ))

    return dpnp_impl
Esempio n. 28
0
def dpnp_random_impl(n, pvals, size=None):
    name = "multinomial"
    dpnp_lowering.ensure_dpnp(name)

    ret_type = types.void
    """
    dpnp source:
    https://github.com/IntelPython/dpnp/blob/0.4.0/dpnp/backend/custom_kernels_random.cpp#L218

    Function declaration:
    void custom_rng_multinomial_c(void* result, int ntrial, const double* p_vector,
                                  const size_t p_vector_size, size_t size)
    """
    sig = signature(
        ret_type,
        types.voidptr,
        types.int32,
        types.voidptr,
        types.intp,
        types.intp,
    )
    dpnp_func = dpnp_ext.dpnp_func("dpnp_" + name, ["int32", "NONE"], sig)

    res_dtype = np.int32

    PRINT_DEBUG = dpnp_lowering.DEBUG

    if not isinstance(n, types.Integer):
        raise TypeError("np.random.multinomial(): n should be an "
                        "integer, got %s" % (n, ))

    if not isinstance(pvals, (types.Sequence, types.Array)):
        raise TypeError("np.random.multinomial(): pvals should be an "
                        "array or sequence, got %s" % (pvals, ))

    if size in (None, types.none):

        def dpnp_impl(n, pvals, size=None):
            out = np.zeros(len(pvals), res_dtype)
            common_impl_multinomial(n, pvals, out, dpnp_func, PRINT_DEBUG)
            return out

    elif isinstance(size, types.Integer):

        def dpnp_impl(n, pvals, size=None):
            out = np.zeros((size, len(pvals)), res_dtype)
            common_impl_multinomial(n, pvals, out, dpnp_func, PRINT_DEBUG)
            return out

    elif isinstance(size, types.BaseTuple):

        def dpnp_impl(n, pvals, size=None):
            out = np.zeros(size + (len(pvals), ), res_dtype)
            common_impl_multinomial(n, pvals, out, dpnp_func, PRINT_DEBUG)
            return out

    else:
        raise TypeError("np.random.multinomial(): size should be int or "
                        "tuple or None, got %s" % (size, ))

    return dpnp_impl
Esempio n. 29
0
def dpnp_take_impl(a, ind):
    name = "take"
    dpnp_lowering.ensure_dpnp(name)

    ret_type = types.void
    """
    dpnp source:
    https://github.com/IntelPython/dpnp/blob/ca6eb1b8fc561957402b6f258529f862c4a8f945/dpnp/backend/kernels/dpnp_krnl_indexing.cpp#L479
    Function declaration:
    void dpnp_take_c(void* array1_in, const size_t array1_size, void* indices1, void* result1, size_t size)
    """
    sig = signature(
        ret_type,
        types.voidptr,
        types.intp,
        types.voidptr,
        types.voidptr,
        types.intp,
    )
    dpnp_func = dpnp_ext.dpnp_func("dpnp_" + name, [a.dtype.name, "NONE"], sig)

    res_dtype = a.dtype
    PRINT_DEBUG = dpnp_lowering.DEBUG

    def dpnp_impl(a, ind):
        if a.size == 0:
            raise ValueError("Passed Empty array")

        sycl_queue = dpctl_functions.get_current_queue()

        a_usm = dpctl_functions.malloc_shared(a.size * a.itemsize, sycl_queue)
        event = dpctl_functions.queue_memcpy(sycl_queue, a_usm, a.ctypes,
                                             a.size * a.itemsize)
        dpctl_functions.event_wait(event)
        dpctl_functions.event_delete(event)

        ind_usm = dpctl_functions.malloc_shared(ind.size * ind.itemsize,
                                                sycl_queue)
        event = dpctl_functions.queue_memcpy(sycl_queue, ind_usm, ind.ctypes,
                                             ind.size * ind.itemsize)
        dpctl_functions.event_wait(event)
        dpctl_functions.event_delete(event)

        out = np.arange(0, ind.size, 1, res_dtype).reshape(ind.shape)
        out_usm = dpctl_functions.malloc_shared(out.size * out.itemsize,
                                                sycl_queue)

        dpnp_func(a_usm, a.size * a.itemsize, ind_usm, out_usm, ind.size)

        event = dpctl_functions.queue_memcpy(sycl_queue, out.ctypes, out_usm,
                                             out.size * out.itemsize)
        dpctl_functions.event_wait(event)
        dpctl_functions.event_delete(event)

        dpctl_functions.free_with_queue(a_usm, sycl_queue)
        dpctl_functions.free_with_queue(ind_usm, sycl_queue)
        dpctl_functions.free_with_queue(out_usm, sycl_queue)

        dpnp_ext._dummy_liveness_func([a.size, ind.size, out.size])

        if PRINT_DEBUG:
            print("dpnp implementation")
        return out

    return dpnp_impl
Esempio n. 30
0
def dpnp_repeat_impl(a, repeats):
    name = "repeat"
    dpnp_lowering.ensure_dpnp(name)

    ret_type = types.void
    """
    dpnp source:
    https://github.com/IntelPython/dpnp/blob/0.6.2/dpnp/backend/kernels/dpnp_krnl_manipulation.cpp#L46
    Function declaration:
    void dpnp_repeat_c(const void* array1_in, void* result1, const size_t repeats, const size_t size)
    """
    sig = signature(
        ret_type,
        types.voidptr,
        types.voidptr,
        types.intp,
        types.intp,
    )
    dpnp_func = dpnp_ext.dpnp_func("dpnp_" + name, [a.dtype.name, "NONE"], sig)

    PRINT_DEBUG = dpnp_lowering.DEBUG

    def dpnp_impl(a, repeats):
        if a.size == 0:
            raise ValueError("Passed Empty array")

        if a.ndim >= 2:
            raise ValueError("Not supported in dpnp")

        new_size = a.size * repeats

        out = np.zeros(new_size, dtype=a.dtype)

        sycl_queue = dpctl_functions.get_current_queue()

        a_usm = dpctl_functions.malloc_shared(a.size * a.itemsize, sycl_queue)
        event = dpctl_functions.queue_memcpy(sycl_queue, a_usm, a.ctypes,
                                             a.size * a.itemsize)
        dpctl_functions.event_wait(event)
        dpctl_functions.event_delete(event)

        out_usm = dpctl_functions.malloc_shared(out.size * out.itemsize,
                                                sycl_queue)

        dpnp_func(a_usm, out_usm, repeats, a.size)

        event = dpctl_functions.queue_memcpy(sycl_queue, out.ctypes, out_usm,
                                             out.size * out.itemsize)
        dpctl_functions.event_wait(event)
        dpctl_functions.event_delete(event)

        dpctl_functions.free_with_queue(a_usm, sycl_queue)
        dpctl_functions.free_with_queue(out_usm, sycl_queue)

        dpnp_ext._dummy_liveness_func([a.size, out.size])

        if PRINT_DEBUG:
            print("dpnp implementation")

        return out

    return dpnp_impl