Universal Functions#

Numba provides a set of decorators to create NumPy universal functions-like routines that are JIT compiled. Although, a close analog to NumPy universal functions Numba’s @vectorize are not fully compatible with a regular NumPy ufunc.. Refer Creating NumPy universal functions for details.

Numba-dpex only supports numba.vectorize decorator and not yet the numba.guvectorize decorator. Another present limitation is that numba-dpex ufunc kernels cannot invoke a numba_dpex.kernel function. .. Ongoing work is in progress to address these limitations.

Example 1: Basic Usage#

Full example can be found at numba_dpex/examples/vectorize.py.

@vectorize(nopython=True)
def ufunc_kernel(x, y):
    return x + y
def test_njit():
    N = 10
    dtype = np.float64

    A = np.arange(N, dtype=dtype)
    B = np.arange(N, dtype=dtype) * 10

    # Use the environment variable SYCL_DEVICE_FILTER to change the default device.
    # See https://github.com/intel/llvm/blob/sycl/sycl/doc/EnvironmentVariables.md#sycl_device_filter.
    device = dpctl.select_default_device()
    print("Using device ...")
    device.print_device_info()

    with dpctl.device_context(device):
        C = ufunc_kernel(A, B)

    print(C)

    print("Done...")

Example 2: Calling numba.vectorize inside a numba_dpex.kernel#

Full example can be found at numba_dpex/examples/blacksholes_njit.py.

Note

numba.cuda requires target='cuda' parameter for numba.vectorize and numba.guvectorize functions. Numba-dpex eschews the target parameter for @vectorize and infers the target from the dpctl.device_context in which the numba.vectorize function is called.

Full Examples#

  • numba_dpex/examples/vectorize.py

  • numba_dpex/examples/blacksholes_njit.py