Project comparisons#

Here is a list of NumPy APIs and corresponding cuNumeric implementations.

A dot in the cunumeric column denotes that cuNumeric implementation is not provided yet. We welcome contributions for these functions.

NumPy vs cuNumeric APIs#

Module-Level#

NumPy

cunumeric

single-GPU/CPU

multi-GPU/CPU

numpy.all

cunumeric.all

numpy.allclose

cunumeric.allclose

numpy.amax

cunumeric.amax

numpy.amin

cunumeric.amin

numpy.angle

numpy.any

cunumeric.any

numpy.append

cunumeric.append

numpy.apply_along_axis

numpy.apply_over_axes

numpy.arange

cunumeric.arange

numpy.argmax

cunumeric.argmax

numpy.argmin

cunumeric.argmin

numpy.argpartition

cunumeric.argpartition

numpy.argsort

cunumeric.argsort

numpy.argwhere

cunumeric.argwhere

numpy.around

numpy.array

cunumeric.array

numpy.array2string

numpy.array_equal

cunumeric.array_equal

numpy.array_equiv

numpy.array_repr

numpy.array_split

cunumeric.array_split

numpy.array_str

numpy.asanyarray

numpy.asarray

cunumeric.asarray

numpy.asarray_chkfinite

numpy.ascontiguousarray

numpy.asfarray

numpy.asfortranarray

numpy.asmatrix

numpy.atleast_1d

cunumeric.atleast_1d

numpy.atleast_2d

cunumeric.atleast_2d

numpy.atleast_3d

cunumeric.atleast_3d

numpy.average

numpy.bartlett

cunumeric.bartlett

numpy.base_repr

numpy.binary_repr

numpy.bincount

cunumeric.bincount

numpy.blackman

cunumeric.blackman

numpy.block

cunumeric.block

numpy.bmat

numpy.broadcast_arrays

numpy.broadcast_shapes

numpy.broadcast_to

numpy.busday_count

numpy.busday_offset

numpy.byte_bounds

numpy.can_cast

numpy.choose

cunumeric.choose

numpy.clip

cunumeric.clip

numpy.column_stack

cunumeric.column_stack

numpy.common_type

numpy.compress

cunumeric.compress

numpy.concatenate

cunumeric.concatenate

numpy.convolve

cunumeric.convolve

numpy.copy

cunumeric.copy

numpy.copyto

numpy.corrcoef

numpy.correlate

numpy.count_nonzero

cunumeric.count_nonzero

numpy.cov

numpy.cross

numpy.cumprod

cunumeric.cumprod

numpy.cumsum

cunumeric.cumsum

numpy.datetime_as_string

numpy.datetime_data

numpy.delete

numpy.deprecate

numpy.deprecate_with_doc

numpy.diag

cunumeric.diag

numpy.diag_indices

cunumeric.diag_indices

numpy.diag_indices_from

cunumeric.diag_indices_from

numpy.diagflat

numpy.diagonal

cunumeric.diagonal

numpy.diff

numpy.digitize

numpy.disp

numpy.dot

cunumeric.dot

numpy.dsplit

cunumeric.dsplit

numpy.dstack

cunumeric.dstack

numpy.ediff1d

numpy.einsum

cunumeric.einsum

numpy.einsum_path

cunumeric.einsum_path

numpy.empty

cunumeric.empty

numpy.empty_like

cunumeric.empty_like

numpy.expand_dims

numpy.extract

cunumeric.extract

numpy.eye

cunumeric.eye

numpy.fill_diagonal

cunumeric.fill_diagonal

numpy.find_common_type

numpy.fix

numpy.flatnonzero

cunumeric.flatnonzero

numpy.flip

cunumeric.flip

numpy.fliplr

numpy.flipud

numpy.format_float_positional

numpy.format_float_scientific

numpy.from_dlpack

numpy.frombuffer

numpy.fromfile

numpy.fromfunction

numpy.fromiter

numpy.frompyfunc

numpy.fromregex

numpy.fromstring

numpy.full

cunumeric.full

numpy.full_like

cunumeric.full_like

numpy.genfromtxt

numpy.geomspace

numpy.get_include

numpy.get_printoptions

numpy.getbufsize

numpy.geterr

numpy.geterrcall

numpy.geterrobj

numpy.gradient

numpy.hamming

cunumeric.hamming

numpy.hanning

cunumeric.hanning

numpy.histogram

numpy.histogram2d

numpy.histogram_bin_edges

numpy.histogramdd

numpy.hsplit

cunumeric.hsplit

numpy.hstack

cunumeric.hstack

numpy.i0

numpy.identity

cunumeric.identity

numpy.imag

cunumeric.imag

numpy.in1d

numpy.indices

cunumeric.indices

numpy.info

numpy.inner

cunumeric.inner

numpy.insert

numpy.interp

numpy.intersect1d

numpy.is_busday

numpy.isclose

cunumeric.isclose

numpy.iscomplex

cunumeric.iscomplex

numpy.iscomplexobj

cunumeric.iscomplexobj

numpy.isfortran

numpy.isin

numpy.isneginf

cunumeric.isneginf

numpy.isposinf

cunumeric.isposinf

numpy.isreal

cunumeric.isreal

numpy.isrealobj

cunumeric.isrealobj

numpy.isscalar

cunumeric.isscalar

numpy.issctype

numpy.issubclass_

numpy.issubdtype

numpy.issubsctype

numpy.ix_

numpy.kaiser

cunumeric.kaiser

numpy.kron

numpy.lexsort

numpy.linspace

cunumeric.linspace

numpy.load

numpy.loadtxt

numpy.logspace

numpy.lookfor

numpy.mask_indices

cunumeric.mask_indices

numpy.mat

numpy.maximum_sctype

numpy.may_share_memory

numpy.mean

cunumeric.mean

numpy.median

numpy.meshgrid

numpy.min_scalar_type

numpy.mintypecode

numpy.moveaxis

cunumeric.moveaxis

numpy.msort

cunumeric.msort

numpy.nan_to_num

numpy.nanargmax

numpy.nanargmin

numpy.nancumprod

cunumeric.nancumprod

numpy.nancumsum

cunumeric.nancumsum

numpy.nanmax

numpy.nanmean

numpy.nanmedian

numpy.nanmin

numpy.nanpercentile

numpy.nanprod

numpy.nanquantile

numpy.nanstd

numpy.nansum

numpy.nanvar

numpy.ndim

cunumeric.ndim

numpy.nested_iters

numpy.nonzero

cunumeric.nonzero

numpy.obj2sctype

numpy.ones

cunumeric.ones

numpy.ones_like

cunumeric.ones_like

numpy.outer

cunumeric.outer

numpy.packbits

cunumeric.packbits

numpy.pad

numpy.partition

cunumeric.partition

numpy.percentile

numpy.piecewise

numpy.place

cunumeric.place

numpy.poly

numpy.polyadd

numpy.polyder

numpy.polydiv

numpy.polyfit

numpy.polyint

numpy.polymul

numpy.polysub

numpy.polyval

numpy.printoptions

numpy.prod

cunumeric.prod

numpy.promote_types

numpy.ptp

numpy.put

cunumeric.put

numpy.put_along_axis

cunumeric.put_along_axis

numpy.putmask

cunumeric.putmask

numpy.quantile

numpy.ravel

cunumeric.ravel

numpy.ravel_multi_index

numpy.real

cunumeric.real

numpy.real_if_close

numpy.repeat

cunumeric.repeat

numpy.require

numpy.reshape

cunumeric.reshape

numpy.resize

numpy.result_type

numpy.roll

numpy.rollaxis

numpy.roots

numpy.rot90

numpy.round_

numpy.row_stack

cunumeric.row_stack

numpy.save

numpy.savetxt

numpy.savez

numpy.savez_compressed

numpy.sctype2char

numpy.searchsorted

cunumeric.searchsorted

numpy.select

numpy.set_printoptions

numpy.set_string_function

numpy.setbufsize

numpy.setdiff1d

numpy.seterr

numpy.seterrcall

numpy.seterrobj

numpy.setxor1d

numpy.shape

cunumeric.shape

numpy.shares_memory

numpy.show_config

numpy.show_runtime

numpy.sinc

numpy.sort

cunumeric.sort

numpy.sort_complex

cunumeric.sort_complex

numpy.source

numpy.split

cunumeric.split

numpy.squeeze

cunumeric.squeeze

numpy.stack

cunumeric.stack

numpy.std

numpy.sum

cunumeric.sum

numpy.swapaxes

cunumeric.swapaxes

numpy.take

cunumeric.take

numpy.take_along_axis

cunumeric.take_along_axis

numpy.tensordot

cunumeric.tensordot

numpy.tile

cunumeric.tile

numpy.trace

cunumeric.trace

numpy.transpose

cunumeric.transpose

numpy.trapz

numpy.tri

cunumeric.tri

numpy.tril

cunumeric.tril

numpy.tril_indices

cunumeric.tril_indices

numpy.tril_indices_from

cunumeric.tril_indices_from

numpy.trim_zeros

numpy.triu

cunumeric.triu

numpy.triu_indices

cunumeric.triu_indices

numpy.triu_indices_from

cunumeric.triu_indices_from

numpy.typename

numpy.union1d

numpy.unique

cunumeric.unique

numpy.unpackbits

cunumeric.unpackbits

numpy.unravel_index

numpy.unwrap

numpy.vander

numpy.var

numpy.vdot

cunumeric.vdot

numpy.vsplit

cunumeric.vsplit

numpy.vstack

cunumeric.vstack

numpy.where

cunumeric.where

numpy.who

numpy.zeros

cunumeric.zeros

numpy.zeros_like

cunumeric.zeros_like

Summary

Number of NumPy functions: 288

Number of functions covered by cunumeric: 122

Ufuncs#

NumPy

cunumeric

single-GPU/CPU

multi-GPU/CPU

numpy.absolute

cunumeric.absolute

numpy.add

cunumeric.add

numpy.arccos

cunumeric.arccos

numpy.arccosh

cunumeric.arccosh

numpy.arcsin

cunumeric.arcsin

numpy.arcsinh

cunumeric.arcsinh

numpy.arctan

cunumeric.arctan

numpy.arctan2

cunumeric.arctan2

numpy.arctanh

cunumeric.arctanh

numpy.bitwise_and

cunumeric.bitwise_and

numpy.bitwise_or

cunumeric.bitwise_or

numpy.bitwise_xor

cunumeric.bitwise_xor

numpy.cbrt

cunumeric.cbrt

numpy.ceil

cunumeric.ceil

numpy.conj

cunumeric.conj

numpy.conjugate

cunumeric.conjugate

numpy.copysign

cunumeric.copysign

numpy.cos

cunumeric.cos

numpy.cosh

cunumeric.cosh

numpy.deg2rad

cunumeric.deg2rad

numpy.degrees

cunumeric.degrees

numpy.divide

cunumeric.divide

numpy.divmod

numpy.equal

cunumeric.equal

numpy.exp

cunumeric.exp

numpy.exp2

cunumeric.exp2

numpy.expm1

cunumeric.expm1

numpy.fabs

cunumeric.fabs

numpy.float_power

cunumeric.float_power

numpy.floor

cunumeric.floor

numpy.floor_divide

cunumeric.floor_divide

numpy.fmax

cunumeric.fmax

numpy.fmin

cunumeric.fmin

numpy.fmod

cunumeric.fmod

numpy.frexp

cunumeric.frexp

numpy.gcd

cunumeric.gcd

numpy.greater

cunumeric.greater

numpy.greater_equal

cunumeric.greater_equal

numpy.heaviside

numpy.hypot

cunumeric.hypot

numpy.invert

cunumeric.invert

numpy.isfinite

cunumeric.isfinite

numpy.isinf

cunumeric.isinf

numpy.isnan

cunumeric.isnan

numpy.isnat

numpy.lcm

cunumeric.lcm

numpy.ldexp

cunumeric.ldexp

numpy.left_shift

cunumeric.left_shift

numpy.less

cunumeric.less

numpy.less_equal

cunumeric.less_equal

numpy.log

cunumeric.log

numpy.log10

cunumeric.log10

numpy.log1p

cunumeric.log1p

numpy.log2

cunumeric.log2

numpy.logaddexp

cunumeric.logaddexp

numpy.logaddexp2

cunumeric.logaddexp2

numpy.logical_and

cunumeric.logical_and

numpy.logical_not

cunumeric.logical_not

numpy.logical_or

cunumeric.logical_or

numpy.logical_xor

cunumeric.logical_xor

numpy.matmul

cunumeric.matmul

numpy.maximum

cunumeric.maximum

numpy.minimum

cunumeric.minimum

numpy.mod

cunumeric.mod

numpy.modf

cunumeric.modf

numpy.multiply

cunumeric.multiply

numpy.negative

cunumeric.negative

numpy.nextafter

cunumeric.nextafter

numpy.not_equal

cunumeric.not_equal

numpy.positive

cunumeric.positive

numpy.power

cunumeric.power

numpy.rad2deg

cunumeric.rad2deg

numpy.radians

cunumeric.radians

numpy.reciprocal

cunumeric.reciprocal

numpy.remainder

cunumeric.remainder

numpy.right_shift

cunumeric.right_shift

numpy.rint

cunumeric.rint

numpy.sign

cunumeric.sign

numpy.signbit

cunumeric.signbit

numpy.sin

cunumeric.sin

numpy.sinh

cunumeric.sinh

numpy.spacing

numpy.sqrt

cunumeric.sqrt

numpy.square

cunumeric.square

numpy.subtract

cunumeric.subtract

numpy.tan

cunumeric.tan

numpy.tanh

cunumeric.tanh

numpy.true_divide

cunumeric.true_divide

numpy.trunc

cunumeric.trunc

Summary

Number of NumPy functions: 89

Number of functions covered by cunumeric: 85

Multi-Dimensional Array#

NumPy

cunumeric

single-GPU/CPU

multi-GPU/CPU

numpy.ndarray.all()

cunumeric.ndarray.all()

numpy.ndarray.any()

cunumeric.ndarray.any()

numpy.ndarray.argmax()

cunumeric.ndarray.argmax()

numpy.ndarray.argmin()

cunumeric.ndarray.argmin()

numpy.ndarray.argpartition()

cunumeric.ndarray.argpartition()

numpy.ndarray.argsort()

cunumeric.ndarray.argsort()

numpy.ndarray.astype()

cunumeric.ndarray.astype()

numpy.ndarray.byteswap()

numpy.ndarray.choose()

cunumeric.ndarray.choose()

numpy.ndarray.clip()

cunumeric.ndarray.clip()

numpy.ndarray.compress()

cunumeric.ndarray.compress()

numpy.ndarray.conj()

cunumeric.ndarray.conj()

numpy.ndarray.conjugate()

cunumeric.ndarray.conjugate()

numpy.ndarray.copy()

cunumeric.ndarray.copy()

numpy.ndarray.cumprod()

cunumeric.ndarray.cumprod()

numpy.ndarray.cumsum()

cunumeric.ndarray.cumsum()

numpy.ndarray.diagonal()

cunumeric.ndarray.diagonal()

numpy.ndarray.dot()

cunumeric.ndarray.dot()

numpy.ndarray.dump()

cunumeric.ndarray.dump()

numpy.ndarray.dumps()

cunumeric.ndarray.dumps()

numpy.ndarray.fill()

cunumeric.ndarray.fill()

numpy.ndarray.flatten()

cunumeric.ndarray.flatten()

numpy.ndarray.getfield()

cunumeric.ndarray.getfield()

numpy.ndarray.item()

cunumeric.ndarray.item()

numpy.ndarray.itemset()

cunumeric.ndarray.itemset()

numpy.ndarray.mean()

cunumeric.ndarray.mean()

numpy.ndarray.newbyteorder()

numpy.ndarray.nonzero()

cunumeric.ndarray.nonzero()

numpy.ndarray.partition()

cunumeric.ndarray.partition()

numpy.ndarray.prod()

cunumeric.ndarray.prod()

numpy.ndarray.ptp()

numpy.ndarray.put()

cunumeric.ndarray.put()

numpy.ndarray.ravel()

cunumeric.ndarray.ravel()

numpy.ndarray.repeat()

numpy.ndarray.reshape()

cunumeric.ndarray.reshape()

numpy.ndarray.resize()

numpy.ndarray.searchsorted()

cunumeric.ndarray.searchsorted()

numpy.ndarray.setfield()

cunumeric.ndarray.setfield()

numpy.ndarray.setflags()

cunumeric.ndarray.setflags()

numpy.ndarray.sort()

cunumeric.ndarray.sort()

numpy.ndarray.squeeze()

cunumeric.ndarray.squeeze()

numpy.ndarray.std()

numpy.ndarray.sum()

cunumeric.ndarray.sum()

numpy.ndarray.swapaxes()

cunumeric.ndarray.swapaxes()

numpy.ndarray.take()

cunumeric.ndarray.take()

numpy.ndarray.tobytes()

cunumeric.ndarray.tobytes()

numpy.ndarray.tofile()

cunumeric.ndarray.tofile()

numpy.ndarray.tolist()

cunumeric.ndarray.tolist()

numpy.ndarray.tostring()

cunumeric.ndarray.tostring()

numpy.ndarray.trace()

cunumeric.ndarray.trace()

numpy.ndarray.transpose()

cunumeric.ndarray.transpose()

numpy.ndarray.var()

numpy.ndarray.view()

cunumeric.ndarray.view()

Summary

Number of NumPy functions: 53

Number of functions covered by cunumeric: 46

Linear Algebra#

NumPy

cunumeric

single-GPU/CPU

multi-GPU/CPU

numpy.linalg.cholesky

cunumeric.linalg.cholesky

numpy.linalg.cond

numpy.linalg.det

numpy.linalg.eig

numpy.linalg.eigh

numpy.linalg.eigvals

numpy.linalg.eigvalsh

numpy.linalg.inv

numpy.linalg.lstsq

numpy.linalg.matrix_power

cunumeric.linalg.matrix_power

numpy.linalg.matrix_rank

numpy.linalg.multi_dot

cunumeric.linalg.multi_dot

numpy.linalg.norm

cunumeric.linalg.norm

numpy.linalg.pinv

numpy.linalg.qr

numpy.linalg.slogdet

numpy.linalg.solve

cunumeric.linalg.solve

numpy.linalg.svd

numpy.linalg.tensorinv

numpy.linalg.tensorsolve

Summary

Number of NumPy functions: 20

Number of functions covered by cunumeric: 5

Discrete Fourier Transform#

NumPy

cunumeric

single-GPU/CPU

multi-GPU/CPU

numpy.fft.fft

cunumeric.fft.fft

numpy.fft.fft2

cunumeric.fft.fft2

numpy.fft.fftfreq

numpy.fft.fftn

cunumeric.fft.fftn

numpy.fft.fftshift

numpy.fft.hfft

cunumeric.fft.hfft

numpy.fft.ifft

cunumeric.fft.ifft

numpy.fft.ifft2

cunumeric.fft.ifft2

numpy.fft.ifftn

cunumeric.fft.ifftn

numpy.fft.ifftshift

numpy.fft.ihfft

cunumeric.fft.ihfft

numpy.fft.irfft

cunumeric.fft.irfft

numpy.fft.irfft2

cunumeric.fft.irfft2

numpy.fft.irfftn

cunumeric.fft.irfftn

numpy.fft.rfft

cunumeric.fft.rfft

numpy.fft.rfft2

cunumeric.fft.rfft2

numpy.fft.rfftfreq

numpy.fft.rfftn

cunumeric.fft.rfftn

Summary

Number of NumPy functions: 18

Number of functions covered by cunumeric: 14

Random Sampling#

NumPy

cunumeric

single-GPU/CPU

multi-GPU/CPU

numpy.random.beta

cunumeric.random.beta

numpy.random.binomial

cunumeric.random.binomial

numpy.random.bytes

cunumeric.random.bytes

numpy.random.chisquare

cunumeric.random.chisquare

numpy.random.choice

numpy.random.default_rng

cunumeric.random.default_rng

numpy.random.dirichlet

numpy.random.exponential

cunumeric.random.exponential

numpy.random.f

cunumeric.random.f

numpy.random.gamma

cunumeric.random.gamma

numpy.random.geometric

cunumeric.random.geometric

numpy.random.get_bit_generator

numpy.random.get_state

numpy.random.gumbel

cunumeric.random.gumbel

numpy.random.hypergeometric

cunumeric.random.hypergeometric

numpy.random.laplace

cunumeric.random.laplace

numpy.random.logistic

cunumeric.random.logistic

numpy.random.lognormal

cunumeric.random.lognormal

numpy.random.logseries

cunumeric.random.logseries

numpy.random.multinomial

numpy.random.multivariate_normal

numpy.random.negative_binomial

cunumeric.random.negative_binomial

numpy.random.noncentral_chisquare

cunumeric.random.noncentral_chisquare

numpy.random.noncentral_f

cunumeric.random.noncentral_f

numpy.random.normal

cunumeric.random.normal

numpy.random.pareto

cunumeric.random.pareto

numpy.random.permutation

numpy.random.poisson

cunumeric.random.poisson

numpy.random.power

cunumeric.random.power

numpy.random.rand

cunumeric.random.rand

numpy.random.randint

cunumeric.random.randint

numpy.random.randn

cunumeric.random.randn

numpy.random.random

cunumeric.random.random

numpy.random.random_integers

cunumeric.random.random_integers

numpy.random.random_sample

cunumeric.random.random_sample

numpy.random.ranf

cunumeric.random.ranf

numpy.random.rayleigh

cunumeric.random.rayleigh

numpy.random.sample

cunumeric.random.sample

numpy.random.seed

cunumeric.random.seed

numpy.random.set_bit_generator

numpy.random.set_state

numpy.random.shuffle

numpy.random.standard_cauchy

cunumeric.random.standard_cauchy

numpy.random.standard_exponential

cunumeric.random.standard_exponential

numpy.random.standard_gamma

cunumeric.random.standard_gamma

numpy.random.standard_normal

numpy.random.standard_t

cunumeric.random.standard_t

numpy.random.triangular

cunumeric.random.triangular

numpy.random.uniform

cunumeric.random.uniform

numpy.random.vonmises

cunumeric.random.vonmises

numpy.random.wald

cunumeric.random.wald

numpy.random.weibull

cunumeric.random.weibull

numpy.random.zipf

cunumeric.random.zipf

Summary

Number of NumPy functions: 53

Number of functions covered by cunumeric: 42

Measuring API coverage#

When running applications that use cunumeric, various command line options may be used to generate coverage reports.

Overall coverage report#

The environment variable CUNUMERIC_REPORT_COVERAGE may be used to print an overall percentage of cunumeric coverage:

CUNUMERIC_REPORT_COVERAGE=1 legate test.py

After execution completes, the percentage of NumPy API calls that were handled by cunumeric is printed:

cuNumeric API coverage: 26/26 (100.0%)

Detailed coverage report#

The environment variable CUNUMERIC_REPORT_DUMP_CSV may be used to save a detailed coverage report:

CUNUMERIC_REPORT_COVERAGE=1 CUNUMERIC_REPORT_DUMP_CSV="out.csv" legate test.py

After execution completes, a CSV file will be saved to the specified location (in this case out.csv). The file shows exactly what NumPy API functions were called, whether the are implemented by cunumeric, and the location of the call site:

function_name,location,implemented
numpy.array,tests/dot.py:27,True
numpy.ndarray.__init__,tests/dot.py:27,True
numpy.array,tests/dot.py:28,True
numpy.ndarray.__init__,tests/dot.py:28,True
numpy.ndarray.dot,tests/dot.py:31,True
numpy.ndarray.__init__,tests/dot.py:31,True
numpy.allclose,tests/dot.py:33,True
numpy.ndarray.__init__,tests/dot.py:33,True

Call stack reporting#

The environment variable CUNUMERIC_REPORT_DUMP_CALLSTACK may be added to include full call stack information in a CSV report:

CUNUMERIC_REPORT_COVERAGE=1 CUNUMERIC_REPORT_DUMP_CALLSTACK=1 CUNUMERIC_REPORT_DUMP_CALLSTACK=1 legate test.py

After execution completes, the CSV output file have full call stack information in the location column, with individual stack frames separated by pipe (|) characters: