From 1420de64d636c1d9fa31839e62c3732a9c37b7da Mon Sep 17 00:00:00 2001 From: ejmeitz Date: Wed, 8 Apr 2026 11:49:17 -0500 Subject: [PATCH 01/10] 1.12 in CI, bump wrapper compat --- .buildkite/pipeline.yml | 2 +- .github/workflows/ci.yml | 2 +- Project.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index 08e3436c..17c80c56 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -35,7 +35,7 @@ steps: julia: - "1.10" - "1.11" - # - "1.12" + - "1.12" arch: - "x64" # adjustments: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e3b9ff34..0daab8c4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -44,7 +44,7 @@ jobs: julia: - '1.10' - '1.11' - # - '1.12' + - '1.12' os: - ubuntu-latest # include: diff --git a/Project.toml b/Project.toml index 59bc50ba..7b2f5a30 100644 --- a/Project.toml +++ b/Project.toml @@ -39,6 +39,6 @@ Pkg = "1.10 - 1.11" Preferences = "1" Random = "1" StatsBase = "0.34" -cunumeric_jl_wrapper_jll = "25.10.2" +cunumeric_jl_wrapper_jll = "25.10.3" cupynumeric_jll = "25.10.2" julia = "1.10 - 1.11" From c851a94283890b67bdc9c2080407d341b322219c Mon Sep 17 00:00:00 2001 From: ejmeitz Date: Wed, 8 Apr 2026 11:50:59 -0500 Subject: [PATCH 02/10] update julia compat --- Project.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Project.toml b/Project.toml index 7b2f5a30..5a4ce40b 100644 --- a/Project.toml +++ b/Project.toml @@ -35,10 +35,10 @@ Legate = "0.1.0" LegatePreferences = "0.1.5" MacroTools = "0.5.16" OpenBLAS32_jll = "0.3" -Pkg = "1.10 - 1.11" +Pkg = "1" Preferences = "1" Random = "1" StatsBase = "0.34" cunumeric_jl_wrapper_jll = "25.10.3" cupynumeric_jll = "25.10.2" -julia = "1.10 - 1.11" +julia = "1.10" From f80b1bc33b9a34688b369b58bd8372caf21e7b59 Mon Sep 17 00:00:00 2001 From: ejmeitz Date: Wed, 8 Apr 2026 13:17:16 -0500 Subject: [PATCH 03/10] relax fbmem reqs --- .buildkite/pipeline.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index 17c80c56..80a7388c 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -13,7 +13,7 @@ steps: - JuliaCI/julia#v1: version: "{{matrix.julia}}" - jquick/pre-hook#v1.2.0: - command: "julia --project -e 'using Pkg; Pkg.add(;url=\"https://github.com/JuliaLegate/Legate.jl.git\"); Pkg.instantiate()'" + command: "julia --project -e 'using Pkg; Pkg.instantiate()'" - JuliaCI/julia-test#v1: test_args: "--quickfail" - JuliaCI/julia-coverage#v1: @@ -29,7 +29,7 @@ steps: LEGATE_SHOW_CONFIG: "1" GPUTESTS: "1" LEGATE_TEST: "1" - LEGATE_CONFIG: "--cpus 1 --gpus 1 --utility 1 --fbmem 2000" + LEGATE_CONFIG: "--cpus 1 --gpus 1 --utility 1 --fbmem 500" matrix: setup: julia: From ef5c3217bd13035efba09836e6eca7e8b304f9f4 Mon Sep 17 00:00:00 2001 From: David Krasowska Date: Wed, 8 Apr 2026 14:49:14 -0500 Subject: [PATCH 04/10] Try LD_LIBRARY_PATH modif pipeline.yml --- .buildkite/pipeline.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index 80a7388c..50a1e58b 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -26,6 +26,7 @@ steps: if: build.message !~ /\[skip tests\]/ timeout_in_minutes: 45 env: + LD_LIBRARY_PATH: "" LEGATE_SHOW_CONFIG: "1" GPUTESTS: "1" LEGATE_TEST: "1" From d7e8619dcb04351374c88bc5b1ccc3cd98a830be Mon Sep 17 00:00:00 2001 From: David Krasowska Date: Wed, 8 Apr 2026 15:06:37 -0500 Subject: [PATCH 05/10] [test] running only 1.11 to see if it passes --- .buildkite/pipeline.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index 50a1e58b..9b51b108 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -34,9 +34,9 @@ steps: matrix: setup: julia: - - "1.10" + # - "1.10" - "1.11" - - "1.12" + # - "1.12" arch: - "x64" # adjustments: From 24c5c616c868e41dce3c63258695cc8cee036681 Mon Sep 17 00:00:00 2001 From: David Krasowska Date: Wed, 8 Apr 2026 15:16:03 -0500 Subject: [PATCH 06/10] auto config disabled. Julia versions reenabled. --- .buildkite/pipeline.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index 9b51b108..dc704f4e 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -27,6 +27,7 @@ steps: timeout_in_minutes: 45 env: LD_LIBRARY_PATH: "" + LEGATE_AUTO_CONFIG: "0" LEGATE_SHOW_CONFIG: "1" GPUTESTS: "1" LEGATE_TEST: "1" @@ -34,9 +35,9 @@ steps: matrix: setup: julia: - # - "1.10" + - "1.10" - "1.11" - # - "1.12" + - "1.12" arch: - "x64" # adjustments: From 5cd57f286cd144db5056c693ac5e242fee139ddd Mon Sep 17 00:00:00 2001 From: ejmeitz Date: Wed, 8 Apr 2026 15:25:11 -0500 Subject: [PATCH 07/10] try this --- .buildkite/pipeline.yml | 2 +- Project.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index dc704f4e..11dbae28 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -13,7 +13,7 @@ steps: - JuliaCI/julia#v1: version: "{{matrix.julia}}" - jquick/pre-hook#v1.2.0: - command: "julia --project -e 'using Pkg; Pkg.instantiate()'" + command: "julia --project -e 'using Pkg; Pkg.resolve(); Pkg.instantiate()'" - JuliaCI/julia-test#v1: test_args: "--quickfail" - JuliaCI/julia-coverage#v1: diff --git a/Project.toml b/Project.toml index 5a4ce40b..91e475a9 100644 --- a/Project.toml +++ b/Project.toml @@ -32,7 +32,7 @@ CUDA = "5.9" CxxWrap = "0.17" JuliaFormatter = "2.3.0" Legate = "0.1.0" -LegatePreferences = "0.1.5" +LegatePreferences = "0.1.6" MacroTools = "0.5.16" OpenBLAS32_jll = "0.3" Pkg = "1" From 8c874405eecd09ca4805b55038ebcb1cbb2a3967 Mon Sep 17 00:00:00 2001 From: ejmeitz Date: Wed, 8 Apr 2026 16:05:15 -0500 Subject: [PATCH 08/10] update docs [skip tests] --- docs/make.jl | 3 +- docs/src/api.md | 94 +++++++++++++++++++++++++++++++++++++++++++ docs/src/benchmark.md | 18 ++++----- docs/src/errors.md | 2 +- docs/src/perf.md | 13 ++++++ docs/src/usage.md | 12 ------ src/ndarray/binary.jl | 41 ------------------- src/ndarray/unary.jl | 57 -------------------------- 8 files changed, 118 insertions(+), 122 deletions(-) delete mode 100644 docs/src/usage.md diff --git a/docs/make.jl b/docs/make.jl index a5bd8f3b..e1a7f0dd 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -14,10 +14,9 @@ makedocs(; ), pages=[ "Home" => "index.md", - "Install Guide" => "install.md", "Examples" => "examples.md", "Performance Tips" => "perf.md", - "Back End Details" => "usage.md", + "Custom Installalation" => "install.md", "Benchmarks" => "benchmark.md", "Public API" => "api.md", ], diff --git a/docs/src/api.md b/docs/src/api.md index fbeaa3d5..6dbe4bbf 100644 --- a/docs/src/api.md +++ b/docs/src/api.md @@ -8,6 +8,100 @@ Pages = ["api.md"] Depth = 2:2 ``` +Supported Unary Operations +=========================== + +The following unary operations are supported and can be broadcast over `NDArray`: + + - `-` (negation) + - `!` (logical not) + - `abs` + - `acos` + - `acosh` + - `asin` + - `asinh` + - `atan` + - `atanh` + - `cbrt` + - `cos` + - `cosh` + - `deg2rad` + - `exp` + - `exp2` + - `expm1` + - `floor` + - `isfinite` + - `log` + - `log10` + - `log1p` + - `log2` + - `rad2deg` + - `sign` + - `signbit` + - `sin` + - `sinh` + - `sqrt` + - `tan` + - `tanh` + - `^2` + - `^-1` or `inv` + +Differences +----------- +- The `acosh` function in Julia will error on inputs outside of the domain (x >= 1) + but cuNumeric.jl will return NaN. + +Examples +-------- + +```julia +A = cuNumeric.ones(Float32, 3, 3) + +abs.(A) +log.(A .+ 1) +-sqrt.(abs.(A)) +``` + + +Supported Binary Operations +=========================== + +The following binary operations are supported and can be applied elementwise to pairs of `NDArray` values: + + • `+` + • `-` + • `*` + • `/` + • `^` + • `<` + • `<=` + • `>` + • `>=` + • `==` + • `!=` + • `atan` + • `hypot` + • `max` + • `min` + • `lcm` + • `gcd` + +These operations are applied elementwise by default and follow standard Julia semantics. + +Examples +-------- + +```julia +A = NDArray(randn(Float64, 4)) +B = NDArray(randn(Float64, 4)) + +A + B +A / B +hypot.(A, B) +div.(A, B) +A .^ 2 +``` + ```@autodocs Modules = [cuNumeric] Pages = ["ndarray/ndarray.jl", "ndarray/unary.jl", "ndarray/binary.jl", "cuNumeric.jl", "warnings.jl", "util.jl", "memory.jl", "scoping.jl"] diff --git a/docs/src/benchmark.md b/docs/src/benchmark.md index d47fb94e..f4a0b845 100644 --- a/docs/src/benchmark.md +++ b/docs/src/benchmark.md @@ -15,9 +15,9 @@ Code Outline: mul!(C, A, B) ``` -GEMM Efficiency | GEMM GFLOPS -:-------------------------:|:-------------------------: -![GEMM Efficiency](images/gemm_efficiency.svg) | ![GEMM GFLOPS](images/gemm_gflops.svg) +| GEMM Efficiency | GEMM GFLOPS | +|---|---| +| ![GEMM Efficiency](images/gemm_efficiency.svg) | ![GEMM GFLOPS](images/gemm_gflops.svg) | ## Monte-Carlo Integration @@ -29,9 +29,9 @@ integrand = (x) -> exp.(-x.^2) val = (V/N) * sum(integrand(x)) ``` -MC Efficiency | MC GFLOPS -:-------------------------:|:-------------------------: -![MC Efficiency](images/mc_eff.svg) | ![MC GFLOPS](images/mc_ops.svg) +| MC Efficiency | MC GFLOPS | +|---|---| +| ![MC Efficiency](images/mc_eff.svg) | ![MC GFLOPS](images/mc_ops.svg) | ## Gray-Scott (2D) @@ -147,6 +147,6 @@ To generate a weak scaling plot, you must increment the problem size in proporti As part of a more complete benchmark we ran our code on up to 8 A100 GPUs (single-node) and compared it to the Python library cuPyNumeric as well as a custom implementation using CUDA.jl. From these resutls we can see that cuNumeric.jl is capable of scaling and saturating the GPU memory bandwidth for matrix multiplication. -GEMM Efficiency | GEMM GFLOPS -:-------------------------:|:-------------------------: -![GEMM Efficiency](images/gemm_efficiency.svg) | ![GEMM GFLOPS](images/gemm_gflops.svg) +| GEMM Efficiency | GEMM GFLOPS | +|---|---| +| ![GEMM Efficiency](images/gemm_efficiency.svg) | ![GEMM GFLOPS](images/gemm_gflops.svg) | diff --git a/docs/src/errors.md b/docs/src/errors.md index 41f0059e..61c65e2d 100644 --- a/docs/src/errors.md +++ b/docs/src/errors.md @@ -1,4 +1,4 @@ # Common Errors ## OOM on Startup -If you have other processes using GPU RAM (e.g. another instance of cuNumeric.jl) then cuNumeric.jl will fail to start and will segfault. The first symbol is typically something like `_ZN5Realm4CudaL22allocate_device_memoryEPNS0_3GPUEm`. You can fix this by killing the other jobs or modifying the amount of GPU RAM requested in `LEGATE_CONFIG`. See the [usage](./usage.md) documentation for examples on how to set the `LEGATE_CONFIG` environment variable. +If you have other processes using GPU RAM (e.g. another instance of cuNumeric.jl) then cuNumeric.jl will fail to start and will segfault. The first symbol is typically something like `_ZN5Realm4CudaL22allocate_device_memoryEPNS0_3GPUEm`. You can fix this by killing the other jobs or modifying the amount of GPU RAM requested in `LEGATE_CONFIG`. See the [performance](./perf.md) documentation for examples on how to set the `LEGATE_CONFIG` environment variable. diff --git a/docs/src/perf.md b/docs/src/perf.md index 71411858..0876b9e8 100644 --- a/docs/src/perf.md +++ b/docs/src/perf.md @@ -6,5 +6,18 @@ Accessing elements of an NDArray one at a time (e.g., `arr[5]`) is slow and shou ## Avoid Implicit Promotion Mixing integral types of different size (e.g., `Float64` and `Float32`) will result in implicit promotion of the smaller type to the larger types. This creates a copy of the data and hurts performance. Implicit promotion from a smaller integral type to a larger integral type will emit an error which can be opted out of with `@allowpromotion` or `allowpromotion() do ... end`. This error is common when mixing literals with `NDArrays`. By default a floating point literal (i.e., 1.0) is `Float64` but the default type of an `NDArray` is `Float32`. +## Setting Hardware Configuration + +There is no programatic way to set the hardware configuration used by CuPyNumeric (as of 26.01). By default, the hardware configuration is set automatically by Legate. This configuration can be manipulated through the following environment variables: + +- `LEGATE_SHOW_CONFIG` : When set to 1, the Legate config is printed to stdout +- `LEGATE_AUTO_CONFIG`: When set to 1, Legate will automatically choose the hardware configuration +- `LEGATE_CONFIG`: A string representing the hardware configuration to set + +These variables must be set before launching the Julia instance running cuNumeric.jl. We recommend setting `export LEGATE_SHOW_CONFIG=1` so that the hardware configuration will be printed when Legate starts. This output is automatically captured and relayed to the user. + +To manually set the hardware configuration, `export LEGATE_AUTO_CONFIG=0`, and then define your own config with something like `export LEGATE_CONFIG="--gpus 1 --cpus 10 --ompthreads 10"`. We recommend using the default memory configuration for your machine and only settings the `gpus`, `cpus` and `ompthreads`. More details about the Legate configuration can be found in the [NVIDIA Legate documentation](https://docs.nvidia.com/legate/latest/usage.html#resource-allocation). If you know where Legate is installed on your computer you can also run `legate --help` for more detailed information. + + ## Kernel Fusion cuPyNumeric does not fuse independent operations automatically, even in broadcast expressions. This is a priority for a future release. diff --git a/docs/src/usage.md b/docs/src/usage.md deleted file mode 100644 index 464e2f80..00000000 --- a/docs/src/usage.md +++ /dev/null @@ -1,12 +0,0 @@ - -## Setting Hardware Configuration - -There is no programatic way to set the hardware configuration used by CuPyNumeric (as of 26.01). By default, the hardware configuration is set automatically by Legate. This configuration can be manipulated through the following environment variables: - -- `LEGATE_SHOW_CONFIG` : When set to 1, the Legate config is printed to stdout -- `LEGATE_AUTO_CONFIG`: When set to 1, Legate will automatically choose the hardware configuration -- `LEGATE_CONFIG`: A string representing the hardware configuration to set - -These variables must be set before launching the Julia instance running cuNumeric.jl. We recommend setting `export LEGATE_SHOW_CONFIG=1` so that the hardware configuration will be printed when Legate starts. This output is automatically captured and relayed to the user. - -To manually set the hardware configuration, `export LEGATE_AUTO_CONFIG=0`, and then define your own config with something like `export LEGATE_CONFIG="--gpus 1 --cpus 10 --ompthreads 10"`. We recommend using the default memory configuration for your machine and only settings the `gpus`, `cpus` and `ompthreads`. More details about the Legate configuration can be found in the [NVIDIA Legate documentation](https://docs.nvidia.com/legate/latest/usage.html#resource-allocation). If you know where Legate is installed on your computer you can also run `legate --help` for more detailed information. diff --git a/src/ndarray/binary.jl b/src/ndarray/binary.jl index 847ba6cf..c04b515b 100644 --- a/src/ndarray/binary.jl +++ b/src/ndarray/binary.jl @@ -1,44 +1,3 @@ -@doc""" -Supported Binary Operations -=========================== - -The following binary operations are supported and can be applied elementwise to pairs of `NDArray` values: - - • `+` - • `-` - • `*` - • `/` - • `^` - • `<` - • `<=` - • `>` - • `>=` - • `==` - • `!=` - • `atan` - • `hypot` - • `max` - • `min` - • `lcm` - • `gcd` - -These operations are applied elementwise by default and follow standard Julia semantics. - -Examples --------- - -```julia -A = NDArray(randn(Float64, 4)) -B = NDArray(randn(Float64, 4)) - -A + B -A / B -hypot.(A, B) -div.(A, B) -A .^ 2 -``` -""" - # Still missing: # # Base.copysign => cuNumeric.COPYSIGN, #* ANNOYING TO TEST # #missing => cuNumeric.fmod, #same as mod in Julia? diff --git a/src/ndarray/unary.jl b/src/ndarray/unary.jl index 504a9cf2..6cc7b749 100644 --- a/src/ndarray/unary.jl +++ b/src/ndarray/unary.jl @@ -1,60 +1,3 @@ -export square - -@doc""" -Supported Unary Operations -=========================== - -The following unary operations are supported and can be broadcast over `NDArray`: - - - `-` (negation) - - `!` (logical not) - - `abs` - - `acos` - - `acosh` - - `asin` - - `asinh` - - `atan` - - `atanh` - - `cbrt` - - `cos` - - `cosh` - - `deg2rad` - - `exp` - - `exp2` - - `expm1` - - `floor` - - `isfinite` - - `log` - - `log10` - - `log1p` - - `log2` - - `rad2deg` - - `sign` - - `signbit` - - `sin` - - `sinh` - - `sqrt` - - `tan` - - `tanh` - - `^2` - - `^-1` or `inv` - -Differences ------------ -- The `acosh` function in Julia will error on inputs outside of the domain (x >= 1) - but cuNumeric.jl will return NaN. - -Examples --------- - -```julia -A = cuNumeric.ones(Float32, 3, 3) - -abs.(A) -log.(A .+ 1) --sqrt.(abs.(A)) -``` -""" global const floaty_unary_ops_no_args = Dict{Function,UnaryOpCode}( Base.acos => cuNumeric.ARCCOS, Base.acosh => cuNumeric.ARCCOSH, From 4d0d52d9c760766082f8c8019e9a87b6dbb4d839 Mon Sep 17 00:00:00 2001 From: ejmeitz Date: Wed, 8 Apr 2026 18:54:29 -0500 Subject: [PATCH 09/10] update Legate compat, fix some docs [skip tests] --- Project.toml | 2 +- docs/src/api.md | 87 ++++--------------------------------------------- 2 files changed, 7 insertions(+), 82 deletions(-) diff --git a/Project.toml b/Project.toml index 91e475a9..ab4c1da2 100644 --- a/Project.toml +++ b/Project.toml @@ -31,7 +31,7 @@ CNPreferences = "0.1.2" CUDA = "5.9" CxxWrap = "0.17" JuliaFormatter = "2.3.0" -Legate = "0.1.0" +Legate = "0.1.1" LegatePreferences = "0.1.6" MacroTools = "0.5.16" OpenBLAS32_jll = "0.3" diff --git a/docs/src/api.md b/docs/src/api.md index 6dbe4bbf..180f0789 100644 --- a/docs/src/api.md +++ b/docs/src/api.md @@ -8,99 +8,24 @@ Pages = ["api.md"] Depth = 2:2 ``` -Supported Unary Operations -=========================== - +### Supported Unary Operations The following unary operations are supported and can be broadcast over `NDArray`: - - `-` (negation) - - `!` (logical not) - - `abs` - - `acos` - - `acosh` - - `asin` - - `asinh` - - `atan` - - `atanh` - - `cbrt` - - `cos` - - `cosh` - - `deg2rad` - - `exp` - - `exp2` - - `expm1` - - `floor` - - `isfinite` - - `log` - - `log10` - - `log1p` - - `log2` - - `rad2deg` - - `sign` - - `signbit` - - `sin` - - `sinh` - - `sqrt` - - `tan` - - `tanh` - - `^2` - - `^-1` or `inv` - -Differences ------------ + • `-`, `!`, `abs`, `acos`, `acosh`, `asin`, `asinh`, `atan`, `atanh`, `cbrt`, `cos`, `cosh`, `deg2rad`, `exp`, `exp2`, `expm1`, `floor`, `isfinite`, `log`, `log10`, `log1p`, `log2`, `rad2deg`, `sign`, `signbit`, `sin`, `sinh`, `sqrt`, `tan`, `tanh`, `^2`, `^-1` or `inv` + +##### Differences - The `acosh` function in Julia will error on inputs outside of the domain (x >= 1) but cuNumeric.jl will return NaN. -Examples --------- - -```julia -A = cuNumeric.ones(Float32, 3, 3) - -abs.(A) -log.(A .+ 1) --sqrt.(abs.(A)) -``` -Supported Binary Operations -=========================== - +### Supported Binary Operations The following binary operations are supported and can be applied elementwise to pairs of `NDArray` values: - • `+` - • `-` - • `*` - • `/` - • `^` - • `<` - • `<=` - • `>` - • `>=` - • `==` - • `!=` - • `atan` - • `hypot` - • `max` - • `min` - • `lcm` - • `gcd` + • `+`, `-`, `*`, `/`, `^`, `<`, `<=`, `>`, `>=`, `==`, `!=`, `atan`, `hypot`, `max`, `min`, `lcm`, `gcd` These operations are applied elementwise by default and follow standard Julia semantics. -Examples --------- - -```julia -A = NDArray(randn(Float64, 4)) -B = NDArray(randn(Float64, 4)) - -A + B -A / B -hypot.(A, B) -div.(A, B) -A .^ 2 -``` ```@autodocs Modules = [cuNumeric] From 6fcaa5ecc0a50337b23a98dacde2bf35373a0657 Mon Sep 17 00:00:00 2001 From: ejmeitz Date: Wed, 8 Apr 2026 19:01:42 -0500 Subject: [PATCH 10/10] add some missing things to unary docs [skip tests] --- docs/src/api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/api.md b/docs/src/api.md index 180f0789..89c40519 100644 --- a/docs/src/api.md +++ b/docs/src/api.md @@ -11,7 +11,7 @@ Depth = 2:2 ### Supported Unary Operations The following unary operations are supported and can be broadcast over `NDArray`: - • `-`, `!`, `abs`, `acos`, `acosh`, `asin`, `asinh`, `atan`, `atanh`, `cbrt`, `cos`, `cosh`, `deg2rad`, `exp`, `exp2`, `expm1`, `floor`, `isfinite`, `log`, `log10`, `log1p`, `log2`, `rad2deg`, `sign`, `signbit`, `sin`, `sinh`, `sqrt`, `tan`, `tanh`, `^2`, `^-1` or `inv` + • `-`, `!`, `abs`, `acos`, `acosh`, `asin`, `asinh`, `atan`, `atanh`, `cbrt`, `conj`, `cos`, `cosh`, `deg2rad`, `exp`, `exp2`, `expm1`, `floor`, `imag`, `isfinite`, `log`, `log10`, `log1p`, `log2`, `rad2deg`, `real`, `sign`, `signbit`, `sin`, `sinh`, `sqrt`, `tan`, `tanh`, `^2`, `^-1` or `inv`, ##### Differences - The `acosh` function in Julia will error on inputs outside of the domain (x >= 1)