Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cross-device copy of wrapped arrays fails #1377

Closed
glwagner opened this issue Feb 16, 2022 · 2 comments
Closed

Cross-device copy of wrapped arrays fails #1377

glwagner opened this issue Feb 16, 2022 · 2 comments
Labels
bug Something isn't working cuda array Stuff about CuArray.

Comments

@glwagner
Copy link

It's expected that non-continguous data sending should fail. However, it could be unexpected that it breaks CUDA / the Julia session.

v3.8.1

First we demonstrate that sending contiguous data works charmingly:

julia> versioninfo()
Julia Version 1.7.2
Commit bf53498635 (2022-02-06 15:21 UTC)
Platform Info:
  OS: Linux (x86_64-pc-linux-gnu)
  CPU: Intel(R) Xeon(R) Silver 4214 CPU @ 2.20GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-12.0.1 (ORCJIT, cascadelake)
Environment:
  JULIA_NUM_THREADS = 24
  JULIA_EDITOR = vim

(@v1.7) pkg> st
      Status `~/.julia/environments/v1.7/Project.toml`
  [052768ef] CUDA v3.8.1

julia> using CUDA

julia> CUDA.versioninfo()
CUDA toolkit 11.6, artifact installation
NVIDIA driver 495.29.5, for CUDA 11.5
CUDA driver 11.5

Libraries:
- CUBLAS: 11.8.1
- CURAND: 10.2.9
- CUFFT: 10.7.0
- CUSOLVER: 11.3.2
- CUSPARSE: 11.7.1
- CUPTI: 16.0.0
- NVML: 11.0.0+495.29.5
- CUDNN: 8.30.2 (for CUDA 11.5.0)
- CUTENSOR: 1.4.0 (for CUDA 11.5.0)

Toolchain:
- Julia: 1.7.2
- LLVM: 12.0.1
- PTX ISA support: 3.2, 4.0, 4.1, 4.2, 4.3, 5.0, 6.0, 6.1, 6.3, 6.4, 6.5, 7.0
- Device capability support: sm_35, sm_37, sm_50, sm_52, sm_53, sm_60, sm_61, sm_62, sm_70, sm_72, sm_75, sm_80

4 devices:
  0: NVIDIA TITAN V (sm_70, 10.977 GiB / 11.784 GiB available)
  1: NVIDIA TITAN V (sm_70, 6.795 GiB / 11.784 GiB available)
  2: NVIDIA TITAN V (sm_70, 11.780 GiB / 11.784 GiB available)
  3: NVIDIA TITAN V (sm_70, 741.688 MiB / 11.784 GiB available)

julia> CUDA.allowscalar(false)

julia> data = [(device!(i); CuArray(rand(4, 4))) for i = 0:1]
2-element Vector{CuArray{Float64, 2, CUDA.Mem.DeviceBuffer}}:
 [0.7775537215700612 0.1518368286243047 0.08582539990778337 0.43008967844775237; 0.31630688685120456 0.37696526266302677 0.4908246947726399 0.7849092838650087; 0.14968049748200407 0.609239444458614 0.991234000746238 0.2649360153417871; 0.7845819072341677 0.6839903438402052 0.2909176524428351 0.03517584185446354]
 [0.5284873076167844 0.07978686102911214 0.137951937905607 0.5638013767253348; 0.9771102741404623 0.7776391592322706 0.3050609544118179 0.6572564425415072; 0.597259322158283 0.1885834528629552 0.5309914201902712 0.9698910976439445; 0.7978452520970586 0.6374771038603203 0.02273782728148288 0.0338868591966166]

julia> v0 = view(data[1], :, 2:3) # continguous
4×2 CuArray{Float64, 2, CUDA.Mem.DeviceBuffer}:
 0.151837  0.0858254
 0.376965  0.490825
 0.609239  0.991234
 0.68399   0.290918

julia> v1 = view(data[2], :, 2:3)
4×2 CuArray{Float64, 2, CUDA.Mem.DeviceBuffer}:
 0.0797869  0.137952
 0.777639   0.305061
 0.188583   0.530991
 0.637477   0.0227378

julia> device(parent(v0))
CuDevice(0): NVIDIA TITAN V

julia> device(parent(v1))
CuDevice(1): NVIDIA TITAN V

julia> copyto!(v0, v1)
4×2 CuArray{Float64, 2, CUDA.Mem.DeviceBuffer}:
 0.0797869  0.137952
 0.777639   0.305061
 0.188583   0.530991
 0.637477   0.0227378

Now let's try to send non-continguous data:

julia> n0 = view(data[1], 2:3, 2:3) # not continguous
2×2 view(::CuArray{Float64, 2, CUDA.Mem.DeviceBuffer}, 2:3, 2:3) with eltype Float64:
 0.777639  0.305061
 0.188583  0.530991

julia> n1 = view(data[2], 2:3, 2:3)
2×2 view(::CuArray{Float64, 2, CUDA.Mem.DeviceBuffer}, 2:3, 2:3) with eltype Float64:
 0.777639  0.305061
 0.188583  0.530991

julia> device(parent(n0))
CuDevice(0): NVIDIA TITAN V

julia> device(parent(n1))
CuDevice(1): NVIDIA TITAN V

julia> copyto!(n0, n1)
ERROR: CUDA error: an illegal memory access was encountered (code 700, ERROR_ILLEGAL_ADDRESS)
Stacktrace:
 [1] throw_api_error(res::CUDA.cudaError_enum)
   @ CUDA ~/.julia/packages/CUDA/t62lT/lib/cudadrv/error.jl:91
 [2] macro expansion
   @ ~/.julia/packages/CUDA/t62lT/lib/cudadrv/error.jl:101 [inlined]
 [3] cuCtxSynchronize()
   @ CUDA ~/.julia/packages/CUDA/t62lT/lib/utils/call.jl:26
 [4] nonblocking_synchronize
   @ ~/.julia/packages/CUDA/t62lT/lib/cudadrv/context.jl:327 [inlined]
 [5] device_synchronize()
   @ CUDA ~/.julia/packages/CUDA/t62lT/lib/cudadrv/context.jl:317
 [6] top-level scope
   @ ~/.julia/packages/CUDA/t62lT/src/initialization.jl:54

CUDA and Julia are now broken:

julia> a = 1
ERROR: CUDA error: an illegal memory access was encountered (code 700, ERROR_ILLEGAL_ADDRESS)
Stacktrace:
 [1] throw_api_error(res::CUDA.cudaError_enum)
   @ CUDA ~/.julia/packages/CUDA/t62lT/lib/cudadrv/error.jl:91
 [2] isdone
   @ ~/.julia/packages/CUDA/t62lT/lib/cudadrv/stream.jl:109 [inlined]
 [3] nonblocking_synchronize
   @ ~/.julia/packages/CUDA/t62lT/lib/cudadrv/stream.jl:139 [inlined]
 [4] nonblocking_synchronize
   @ ~/.julia/packages/CUDA/t62lT/lib/cudadrv/context.jl:323 [inlined]
 [5] device_synchronize()
   @ CUDA ~/.julia/packages/CUDA/t62lT/lib/cudadrv/context.jl:317
 [6] top-level scope
   @ ~/.julia/packages/CUDA/t62lT/src/initialization.jl:54

When exiting Julia we get

error in running finalizer: CUDA.CuError(code=CUDA.cudaError_enum(0x000002bc), meta=nothing)
<snip>
The rest of the error error in running finalizer: CUDA.CuError(code=CUDA.cudaError_enum(0x000002bc), meta=nothing) throw_api_error at /home/greg/.julia/packages/CUDA/t62lT/lib/cudadrv/error.jl:91 macro expansion at /home/greg/.julia/packages/CUDA/t62lT/lib/cudadrv/error.jl:101 [inlined] cuModuleUnload at /home/greg/.julia/packages/CUDA/t62lT/lib/utils/call.jl:26 #27 at /home/greg/.julia/packages/CUDA/t62lT/lib/cudadrv/module.jl:82 [inlined] #context!#63 at /home/greg/.julia/packages/CUDA/t62lT/lib/cudadrv/state.jl:164 unknown function (ip: 0x7fe39c0fa1ab) _jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2247 [inlined] jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2429 context!##kw at /home/greg/.julia/packages/CUDA/t62lT/lib/cudadrv/state.jl:161 unknown function (ip: 0x7fe39c0f9bf8) unsafe_unload! at /home/greg/.julia/packages/CUDA/t62lT/lib/cudadrv/module.jl:81 _jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2247 [inlined] jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2429 jl_apply at /buildworker/worker/package_linux64/build/src/julia.h:1788 [inlined] run_finalizer at /buildworker/worker/package_linux64/build/src/gc.c:278 jl_gc_run_finalizers_in_list at /buildworker/worker/package_linux64/build/src/gc.c:365 run_finalizers at /buildworker/worker/package_linux64/build/src/gc.c:394 [inlined] jl_gc_run_all_finalizers at /buildworker/worker/package_linux64/build/src/gc.c:482 jl_atexit_hook at /buildworker/worker/package_linux64/build/src/init.c:240 jl_repl_entrypoint at /buildworker/worker/package_linux64/build/src/jlapi.c:702 main at /buildworker/worker/package_linux64/build/cli/loader_exe.c:42 __libc_start_main at /lib/x86_64-linux-gnu/libc.so.6 (unknown line) _start at ./julia (unknown line) error in running finalizer: CUDA.CuError(code=CUDA.cudaError_enum(0x000002bc), meta=nothing) throw_api_error at /home/greg/.julia/packages/CUDA/t62lT/lib/cudadrv/error.jl:91 macro expansion at /home/greg/.julia/packages/CUDA/t62lT/lib/cudadrv/error.jl:101 [inlined] cuStreamDestroy_v2 at /home/greg/.julia/packages/CUDA/t62lT/lib/utils/call.jl:26 #10 at /home/greg/.julia/packages/CUDA/t62lT/lib/cudadrv/stream.jl:86 [inlined] #context!#63 at /home/greg/.julia/packages/CUDA/t62lT/lib/cudadrv/state.jl:164 unknown function (ip: 0x7fe39c0faf8b) _jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2247 [inlined] jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2429 context!##kw at /home/greg/.julia/packages/CUDA/t62lT/lib/cudadrv/state.jl:161 unsafe_destroy! at /home/greg/.julia/packages/CUDA/t62lT/lib/cudadrv/stream.jl:85 _jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2247 [inlined] jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2429 jl_apply at /buildworker/worker/package_linux64/build/src/julia.h:1788 [inlined] run_finalizer at /buildworker/worker/package_linux64/build/src/gc.c:278 jl_gc_run_finalizers_in_list at /buildworker/worker/package_linux64/build/src/gc.c:365 run_finalizers at /buildworker/worker/package_linux64/build/src/gc.c:394 [inlined] jl_gc_run_all_finalizers at /buildworker/worker/package_linux64/build/src/gc.c:482 jl_atexit_hook at /buildworker/worker/package_linux64/build/src/init.c:240 jl_repl_entrypoint at /buildworker/worker/package_linux64/build/src/jlapi.c:702 main at /buildworker/worker/package_linux64/build/cli/loader_exe.c:42 __libc_start_main at /lib/x86_64-linux-gnu/libc.so.6 (unknown line) _start at ./julia (unknown line) error in running finalizer: CUDA.CuError(code=CUDA.cudaError_enum(0x000002bc), meta=nothing) throw_api_error at /home/greg/.julia/packages/CUDA/t62lT/lib/cudadrv/error.jl:91 macro expansion at /home/greg/.julia/packages/CUDA/t62lT/lib/cudadrv/error.jl:101 [inlined] cuStreamDestroy_v2 at /home/greg/.julia/packages/CUDA/t62lT/lib/utils/call.jl:26 #10 at /home/greg/.julia/packages/CUDA/t62lT/lib/cudadrv/stream.jl:86 [inlined] #context!#63 at /home/greg/.julia/packages/CUDA/t62lT/lib/cudadrv/state.jl:164 unknown function (ip: 0x7fe39c0faf8b) _jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2247 [inlined] jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2429 context!##kw at /home/greg/.julia/packages/CUDA/t62lT/lib/cudadrv/state.jl:161 unsafe_destroy! at /home/greg/.julia/packages/CUDA/t62lT/lib/cudadrv/stream.jl:85 _jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2247 [inlined] jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2429 jl_apply at /buildworker/worker/package_linux64/build/src/julia.h:1788 [inlined] run_finalizer at /buildworker/worker/package_linux64/build/src/gc.c:278 jl_gc_run_finalizers_in_list at /buildworker/worker/package_linux64/build/src/gc.c:365 run_finalizers at /buildworker/worker/package_linux64/build/src/gc.c:394 [inlined] jl_gc_run_all_finalizers at /buildworker/worker/package_linux64/build/src/gc.c:482 jl_atexit_hook at /buildworker/worker/package_linux64/build/src/init.c:240 jl_repl_entrypoint at /buildworker/worker/package_linux64/build/src/jlapi.c:702 main at /buildworker/worker/package_linux64/build/cli/loader_exe.c:42 __libc_start_main at /lib/x86_64-linux-gnu/libc.so.6 (unknown line) _start at ./julia (unknown line) WARNING: Error while freeing DeviceBuffer(128 bytes at 0x0000000be8000000): CUDA.CuError(code=CUDA.cudaError_enum(0x000002bc), meta=nothing)

Stacktrace:
[1] throw_api_error(res::CUDA.cudaError_enum)
@ Unhandled Task ERROR: EOFError: read end of file
Stacktrace:
[1] wait
@ ./asyncevent.jl:136 [inlined]
[2] sleep(sec::Int64)
@ Base ./asyncevent.jl:221
[3] pool_cleanup()
@ CUDA ~/.julia/packages/CUDA/t62lT/src/pool.jl:126
[4] (::CUDA.var"#190#191")()
@ CUDA ./threadingconstructs.jl:178
CUDA ~/.julia/packages/CUDA/t62lT/lib/cudadrv/error.jl:91
[2] macro expansion
@ ~/.julia/packages/CUDA/t62lT/lib/cudadrv/error.jl:101 [inlined]
[3] cuMemFreeAsync(dptr::CUDA.Mem.DeviceBuffer, hStream::CuStream)
@ CUDA ~/.julia/packages/CUDA/t62lT/lib/utils/call.jl:26
[4] #free#2
@ ~/.julia/packages/CUDA/t62lT/lib/cudadrv/memory.jl:96 [inlined]
[5] macro expansion
@ ~/.julia/packages/CUDA/t62lT/src/pool.jl:58 [inlined]
[6] macro expansion
@ ./timing.jl:299 [inlined]
[7] #actual_free#183
@ ~/.julia/packages/CUDA/t62lT/src/pool.jl:57 [inlined]
[8] #_free#199
@ ~/.julia/packages/CUDA/t62lT/src/pool.jl:263 [inlined]
[9] macro expansion
@ ~/.julia/packages/CUDA/t62lT/src/pool.jl:243 [inlined]
[10] macro expansion
@ ./timing.jl:299 [inlined]
[11] #free#198
@ ~/.julia/packages/CUDA/t62lT/src/pool.jl:242 [inlined]
[12] #204
@ ~/.julia/packages/CUDA/t62lT/src/array.jl:81 [inlined]
[13] context!(f::CUDA.var"#204#205"{CuArray{Float64, 2, CUDA.Mem.DeviceBuffer}, CuStream}, ctx::CuContext; skip_destroyed::Bool)
@ CUDA ~/.julia/packages/CUDA/t62lT/lib/cudadrv/state.jl:164
[14] unsafe_free!(xs::CuArray{Float64, 2, CUDA.Mem.DeviceBuffer}, stream::CuStream)
@ CUDA ~/.julia/packages/CUDA/t62lT/src/array.jl:80
[15] unsafe_finalize!(xs::CuArray{Float64, 2, CUDA.Mem.DeviceBuffer})
@ CUDA ~/.julia/packages/CUDA/t62lT/src/array.jl:101
error in running finalizer: CUDA.CuError(code=CUDA.cudaError_enum(0x000002bc), meta=nothing)
throw_api_error at /home/greg/.julia/packages/CUDA/t62lT/lib/cudadrv/error.jl:91
macro expansion at /home/greg/.julia/packages/CUDA/t62lT/lib/cudadrv/error.jl:101 [inlined]
cuStreamDestroy_v2 at /home/greg/.julia/packages/CUDA/t62lT/lib/utils/call.jl:26
#10 at /home/greg/.julia/packages/CUDA/t62lT/lib/cudadrv/stream.jl:86 [inlined]
#context!#63 at /home/greg/.julia/packages/CUDA/t62lT/lib/cudadrv/state.jl:164
unknown function (ip: 0x7fe39c0faf8b)
_jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2247 [inlined]
jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2429
context!##kw at /home/greg/.julia/packages/CUDA/t62lT/lib/cudadrv/state.jl:161
unsafe_destroy! at /home/greg/.julia/packages/CUDA/t62lT/lib/cudadrv/stream.jl:85
_jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2247 [inlined]
jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2429
jl_apply at /buildworker/worker/package_linux64/build/src/julia.h:1788 [inlined]
run_finalizer at /buildworker/worker/package_linux64/build/src/gc.c:278
jl_gc_run_finalizers_in_list at /buildworker/worker/package_linux64/build/src/gc.c:365
run_finalizers at /buildworker/worker/package_linux64/build/src/gc.c:394 [inlined]
jl_gc_run_all_finalizers at /buildworker/worker/package_linux64/build/src/gc.c:482
jl_atexit_hook at /buildworker/worker/package_linux64/build/src/init.c:240
jl_repl_entrypoint at /buildworker/worker/package_linux64/build/src/jlapi.c:702
main at /buildworker/worker/package_linux64/build/cli/loader_exe.c:42
__libc_start_main at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
_start at ./julia (unknown line)
WARNING: Error while freeing DeviceBuffer(128 bytes at 0x0000000602000000):
CUDA.CuError(code=CUDA.cudaError_enum(0x000002bc), meta=nothing)

Stacktrace:
[1] throw_api_error(res::CUDA.cudaError_enum)
@ CUDA ~/.julia/packages/CUDA/t62lT/lib/cudadrv/error.jl:91
[2] macro expansion
@ ~/.julia/packages/CUDA/t62lT/lib/cudadrv/error.jl:101 [inlined]
[3] cuMemFreeAsync(dptr::CUDA.Mem.DeviceBuffer, hStream::CuStream)
@ CUDA ~/.julia/packages/CUDA/t62lT/lib/utils/call.jl:26
[4] #free#2
@ ~/.julia/packages/CUDA/t62lT/lib/cudadrv/memory.jl:96 [inlined]
[5] macro expansion
@ ~/.julia/packages/CUDA/t62lT/src/pool.jl:58 [inlined]
[6] macro expansion
@ ./timing.jl:299 [inlined]
[7] #actual_free#183
@ ~/.julia/packages/CUDA/t62lT/src/pool.jl:57 [inlined]
[8] #_free#199
@ ~/.julia/packages/CUDA/t62lT/src/pool.jl:263 [inlined]
[9] macro expansion
@ ~/.julia/packages/CUDA/t62lT/src/pool.jl:243 [inlined]
[10] macro expansion
@ ./timing.jl:299 [inlined]
[11] #free#198
@ ~/.julia/packages/CUDA/t62lT/src/pool.jl:242 [inlined]
[12] #204
@ ~/.julia/packages/CUDA/t62lT/src/array.jl:81 [inlined]
[13] context!(f::CUDA.var"#204#205"{CuArray{Float64, 2, CUDA.Mem.DeviceBuffer}, CuStream}, ctx::CuContext; skip_destroyed::Bool)
@ CUDA ~/.julia/packages/CUDA/t62lT/lib/cudadrv/state.jl:164
[14] unsafe_free!(xs::CuArray{Float64, 2, CUDA.Mem.DeviceBuffer}, stream::CuStream)
@ CUDA ~/.julia/packages/CUDA/t62lT/src/array.jl:80
[15] unsafe_finalize!(xs::CuArray{Float64, 2, CUDA.Mem.DeviceBuffer})
@ CUDA ~/.julia/packages/CUDA/t62lT/src/array.jl:101
error in running finalizer: CUDA.CuError(code=CUDA.cudaError_enum(0x000002bc), meta=nothing)
throw_api_error at /home/greg/.julia/packages/CUDA/t62lT/lib/cudadrv/error.jl:91
macro expansion at /home/greg/.julia/packages/CUDA/t62lT/lib/cudadrv/error.jl:101 [inlined]
cuStreamDestroy_v2 at /home/greg/.julia/packages/CUDA/t62lT/lib/utils/call.jl:26
#10 at /home/greg/.julia/packages/CUDA/t62lT/lib/cudadrv/stream.jl:86 [inlined]
#context!#63 at /home/greg/.julia/packages/CUDA/t62lT/lib/cudadrv/state.jl:164
unknown function (ip: 0x7fe39c0faf8b)
_jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2247 [inlined]
jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2429
context!##kw at /home/greg/.julia/packages/CUDA/t62lT/lib/cudadrv/state.jl:161
unsafe_destroy! at /home/greg/.julia/packages/CUDA/t62lT/lib/cudadrv/stream.jl:85
_jl_invoke at /buildworker/worker/package_linux64/build/src/gf.c:2247 [inlined]
jl_apply_generic at /buildworker/worker/package_linux64/build/src/gf.c:2429
jl_apply at /buildworker/worker/package_linux64/build/src/julia.h:1788 [inlined]
run_finalizer at /buildworker/worker/package_linux64/build/src/gc.c:278
jl_gc_run_finalizers_in_list at /buildworker/worker/package_linux64/build/src/gc.c:365
run_finalizers at /buildworker/worker/package_linux64/build/src/gc.c:394 [inlined]
jl_gc_run_all_finalizers at /buildworker/worker/package_linux64/build/src/gc.c:482
jl_atexit_hook at /buildworker/worker/package_linux64/build/src/init.c:240
jl_repl_entrypoint at /buildworker/worker/package_linux64/build/src/jlapi.c:702
main at /buildworker/worker/package_linux64/build/cli/loader_exe.c:42
__libc_start_main at /lib/x86_64-linux-gnu/libc.so.6 (unknown line)
_start at ./julia (unknown line)

@glwagner glwagner added the bug Something isn't working label Feb 16, 2022
@maleadt
Copy link
Member

maleadt commented Feb 17, 2022

Ah yeah, that's not supported for now. This fails like any cross-device copy used to fail. It still does because I only implemented the cross-device copy between CuArrays, once you wrap them (e.g., here with a SubArray) the specialized dispatch gets lost and we fall back to the kernel-based GPUArrays implementation. That one then fails because it does not handle multiple devices.

To fix this, I guess we either have to add specialized functions to CUDA.jl (but where do we draw the line then? with SubArray? or also LinearAlgebra wrappers? etc), and/or teach GPUArrays about the specific device (for which we'd also need to model unified memory, etc).

@maleadt maleadt added the cuda array Stuff about CuArray. label Feb 17, 2022
@maleadt maleadt changed the title CUDA breaks after attempting to send non-contiguous data between devices Cross-device copy of wrapped arrays fails Feb 17, 2022
@maleadt
Copy link
Member

maleadt commented Apr 27, 2024

Accessing memory from another device in a kernel works now, so the GPUArrays fallbacks should work.

@maleadt maleadt closed this as completed Apr 27, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working cuda array Stuff about CuArray.
Projects
None yet
Development

No branches or pull requests

2 participants