From 612e56fab794914da6773d65eb5be3e850b6e2bc Mon Sep 17 00:00:00 2001 From: nHacke Date: Thu, 6 Feb 2025 08:35:02 +0100 Subject: [PATCH 1/5] Add storage_type for adjoint, tranpose and Diagonal s.t. they work for GPU arrays --- src/abstract.jl | 5 +++++ test/gpu/amdgpu.jl | 8 ++++++++ test/gpu/nvidia.jl | 7 +++++++ 3 files changed, 20 insertions(+) diff --git a/src/abstract.jl b/src/abstract.jl index a08bd632..c3940a33 100644 --- a/src/abstract.jl +++ b/src/abstract.jl @@ -174,6 +174,11 @@ storage_type(op::AbstractLinearOperator) = error("please implement storage_type storage_type(op::LinearOperator) = typeof(op.Mv5) storage_type(M::AbstractMatrix{T}) where {T} = Vector{T} +# Lazy wrappers +storage_type(op::Adjoint) = storage_type(parent(op)) +storage_type(op::Transpose) = storage_type(parent(op)) +storage_type(op::Diagonal) = typeof(parent(op)) + """ reset!(op) diff --git a/test/gpu/amdgpu.jl b/test/gpu/amdgpu.jl index bda6b90f..762a615e 100644 --- a/test/gpu/amdgpu.jl +++ b/test/gpu/amdgpu.jl @@ -6,10 +6,18 @@ using LinearOperators, AMDGPU B = ROCArray(rand(Float32, 10, 10)) C = ROCArray(rand(Float32, 20, 20)) M = BlockDiagonalOperator(A, B, C) + v = ROCArray(rand(5)) + v = ROCArray(rand(Float32, 35)) y = M * v @test y isa ROCArray{Float32} + @test LinearOperators.storage_type(A) == LinearOperators.storage_type(adjoint(A)) + @test LinearOperators.storage_type(A) == LinearOperators.storage_type(transpose(A)) + @test LinearOperators.storage_type(A) == LinearOperators.storage_type(adjoint(A)) + @test LinearOperators.storage_type(Diagonal(v)) == typeof(v) + + @testset "AMDGPU S kwarg" test_S_kwarg(arrayType = ROCArray) end diff --git a/test/gpu/nvidia.jl b/test/gpu/nvidia.jl index c707dee8..37419b34 100644 --- a/test/gpu/nvidia.jl +++ b/test/gpu/nvidia.jl @@ -9,6 +9,13 @@ using LinearOperators, CUDA, CUDA.CUSPARSE, CUDA.CUSOLVER B = CUDA.rand(10, 10) C = CUDA.rand(20, 20) M = BlockDiagonalOperator(A, B, C) + v = CUDA.rand(5) + + @test LinearOperators.storage_type(A) == LinearOperators.storage_type(adjoint(A)) + @test LinearOperators.storage_type(A) == LinearOperators.storage_type(transpose(A)) + @test LinearOperators.storage_type(A) == LinearOperators.storage_type(adjoint(A)) + @test LinearOperators.storage_type(Diagonal(v)) == typeof(v) + v = CUDA.rand(35) y = M * v From 8c1037b69670736288be0447b87927f3164d0aca Mon Sep 17 00:00:00 2001 From: Niklas Hackelberg Date: Tue, 18 Feb 2025 09:03:39 +0100 Subject: [PATCH 2/5] Make lazy wrapper tests for GPUs more consistent --- test/gpu/amdgpu.jl | 2 -- test/gpu/nvidia.jl | 12 ++++++------ 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/test/gpu/amdgpu.jl b/test/gpu/amdgpu.jl index 762a615e..99d0724b 100644 --- a/test/gpu/amdgpu.jl +++ b/test/gpu/amdgpu.jl @@ -6,8 +6,6 @@ using LinearOperators, AMDGPU B = ROCArray(rand(Float32, 10, 10)) C = ROCArray(rand(Float32, 20, 20)) M = BlockDiagonalOperator(A, B, C) - v = ROCArray(rand(5)) - v = ROCArray(rand(Float32, 35)) y = M * v diff --git a/test/gpu/nvidia.jl b/test/gpu/nvidia.jl index 37419b34..56aab5ff 100644 --- a/test/gpu/nvidia.jl +++ b/test/gpu/nvidia.jl @@ -8,17 +8,17 @@ using LinearOperators, CUDA, CUDA.CUSPARSE, CUDA.CUSOLVER A = CUDA.rand(5, 5) B = CUDA.rand(10, 10) C = CUDA.rand(20, 20) - M = BlockDiagonalOperator(A, B, C) - v = CUDA.rand(5) + M = BlockDiagonalOperator(A, B, C) + + v = CUDA.rand(35) + y = M * v + @test y isa CuVector{Float32} @test LinearOperators.storage_type(A) == LinearOperators.storage_type(adjoint(A)) @test LinearOperators.storage_type(A) == LinearOperators.storage_type(transpose(A)) @test LinearOperators.storage_type(A) == LinearOperators.storage_type(adjoint(A)) @test LinearOperators.storage_type(Diagonal(v)) == typeof(v) - - v = CUDA.rand(35) - y = M * v - @test y isa CuVector{Float32} + @testset "Nvidia S kwarg" test_S_kwarg(arrayType = CuArray) end From 7c4924ad022655820fa9342d678f403f4fb96825 Mon Sep 17 00:00:00 2001 From: Dominique Date: Wed, 9 Apr 2025 18:56:41 -0400 Subject: [PATCH 3/5] Update test/gpu/nvidia.jl --- test/gpu/nvidia.jl | 1 - 1 file changed, 1 deletion(-) diff --git a/test/gpu/nvidia.jl b/test/gpu/nvidia.jl index 56aab5ff..ae86918a 100644 --- a/test/gpu/nvidia.jl +++ b/test/gpu/nvidia.jl @@ -19,6 +19,5 @@ using LinearOperators, CUDA, CUDA.CUSPARSE, CUDA.CUSOLVER @test LinearOperators.storage_type(A) == LinearOperators.storage_type(adjoint(A)) @test LinearOperators.storage_type(Diagonal(v)) == typeof(v) - @testset "Nvidia S kwarg" test_S_kwarg(arrayType = CuArray) end From ad2a14196a06643bf1ce5f6fcdce1214041249fd Mon Sep 17 00:00:00 2001 From: Dominique Date: Wed, 9 Apr 2025 18:56:57 -0400 Subject: [PATCH 4/5] Update test/gpu/nvidia.jl --- test/gpu/nvidia.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/gpu/nvidia.jl b/test/gpu/nvidia.jl index ae86918a..63bf7326 100644 --- a/test/gpu/nvidia.jl +++ b/test/gpu/nvidia.jl @@ -8,7 +8,7 @@ using LinearOperators, CUDA, CUDA.CUSPARSE, CUDA.CUSOLVER A = CUDA.rand(5, 5) B = CUDA.rand(10, 10) C = CUDA.rand(20, 20) - M = BlockDiagonalOperator(A, B, C) + M = BlockDiagonalOperator(A, B, C) v = CUDA.rand(35) y = M * v From 4fa6e9fd3b4659a30d2305766dd4e1a23d2abe31 Mon Sep 17 00:00:00 2001 From: Dominique Date: Wed, 9 Apr 2025 18:57:14 -0400 Subject: [PATCH 5/5] Update test/gpu/amdgpu.jl --- test/gpu/amdgpu.jl | 1 - 1 file changed, 1 deletion(-) diff --git a/test/gpu/amdgpu.jl b/test/gpu/amdgpu.jl index 99d0724b..d12f3b92 100644 --- a/test/gpu/amdgpu.jl +++ b/test/gpu/amdgpu.jl @@ -16,6 +16,5 @@ using LinearOperators, AMDGPU @test LinearOperators.storage_type(A) == LinearOperators.storage_type(adjoint(A)) @test LinearOperators.storage_type(Diagonal(v)) == typeof(v) - @testset "AMDGPU S kwarg" test_S_kwarg(arrayType = ROCArray) end