From 9180f52cb20f99424661c82723e16101a1d9aa30 Mon Sep 17 00:00:00 2001 From: SomTambe Date: Sat, 30 Jan 2021 01:01:15 +0530 Subject: [PATCH 1/7] Add p-norm functionality. --- lib/cublas/linalg.jl | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lib/cublas/linalg.jl b/lib/cublas/linalg.jl index c8b205a2a5..4fb6553da1 100644 --- a/lib/cublas/linalg.jl +++ b/lib/cublas/linalg.jl @@ -37,6 +37,18 @@ end LinearAlgebra.norm(x::DenseCuArray{<:CublasFloat}) = nrm2(x) LinearAlgebra.BLAS.asum(x::StridedCuArray{<:CublasFloat}) = asum(length(x), x) +function LinearAlgebra.norm(x::DenseCuArray{<:CublasFloat}, p::Integer) + if p==1 + return CUBLAS.asum(length(x),x) + end + if p==2 + return LinearAlgebra.norm(x) + end + if p>2 + return LinearAlgebra.tr(LinearAlgebra.Diagonal(abs.(x))^p)^(1/p) + end +end + function LinearAlgebra.axpy!(alpha::Number, x::StridedCuArray{T}, y::StridedCuArray{T}) where T<:CublasFloat length(x)==length(y) || throw(DimensionMismatch("axpy arguments have lengths $(length(x)) and $(length(y))")) axpy!(length(x), alpha, x, y) From e424e018e88fdffe54b59c5e99f4c4e61f1696bb Mon Sep 17 00:00:00 2001 From: SomTambe Date: Mon, 1 Feb 2021 12:25:50 +0000 Subject: [PATCH 2/7] Add tests. --- test/cublas.jl | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/cublas.jl b/test/cublas.jl index 4319abb6bc..dc00e36cf7 100644 --- a/test/cublas.jl +++ b/test/cublas.jl @@ -84,6 +84,14 @@ end mul!(y, f(A), x, Ts(1), Ts(2)) @test Array(dy) ≈ y end + + @testset "norm" begin + x, y, z = CUDA.rand(elty, 1), CUDA.rand(elty, 2), CUDA.rand(elty, m) + @test typeof(norm(x,1)) <: Real + @test typeof(norm(y,2)) <: Real + @test typeof(norm(z,m)) <: Real + end + @testset "banded methods" begin # bands ku = 2 From 1e34822d9fec23576ec7524cdc02ac5a7ed8891a Mon Sep 17 00:00:00 2001 From: SomTambe Date: Mon, 1 Feb 2021 13:08:36 +0000 Subject: [PATCH 3/7] Set CUDA.allowscalar to false before testing. --- test/cublas.jl | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/test/cublas.jl b/test/cublas.jl index dc00e36cf7..9e7c9fc6a5 100644 --- a/test/cublas.jl +++ b/test/cublas.jl @@ -86,10 +86,12 @@ end end @testset "norm" begin - x, y, z = CUDA.rand(elty, 1), CUDA.rand(elty, 2), CUDA.rand(elty, m) - @test typeof(norm(x,1)) <: Real - @test typeof(norm(y,2)) <: Real - @test typeof(norm(z,m)) <: Real + CUDA.allowscalar(false) do + x, y, z = CUDA.rand(elty, 1), CUDA.rand(elty, 2), CUDA.rand(elty, m) + @test typeof(norm(x,1)) <: Real + @test typeof(norm(y,2)) <: Real + @test typeof(norm(z,m)) <: Real + end end @testset "banded methods" begin From fcc1c26ead32225b0d5dc0b5d011eea35d037a31 Mon Sep 17 00:00:00 2001 From: SomTambe Date: Mon, 1 Feb 2021 13:33:16 +0000 Subject: [PATCH 4/7] Modified scalar iteration to a macro. --- test/cublas.jl | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/test/cublas.jl b/test/cublas.jl index 9e7c9fc6a5..3e00e64d80 100644 --- a/test/cublas.jl +++ b/test/cublas.jl @@ -1,5 +1,6 @@ using CUDA.CUBLAS using CUDA.CUBLAS: band, bandex +using GPUArrays using LinearAlgebra @@ -86,12 +87,10 @@ end end @testset "norm" begin - CUDA.allowscalar(false) do - x, y, z = CUDA.rand(elty, 1), CUDA.rand(elty, 2), CUDA.rand(elty, m) - @test typeof(norm(x,1)) <: Real - @test typeof(norm(y,2)) <: Real - @test typeof(norm(z,m)) <: Real - end + x, y, z = CUDA.rand(elty, 1), CUDA.rand(elty, 2), CUDA.rand(elty, m) + @disallowscalar @test typeof(norm(x,1)) <: Real + @disallowscalar @test typeof(norm(y,2)) <: Real + @disallowscalar @test typeof(norm(z,m)) <: Real end @testset "banded methods" begin From 11dd2ac5fe4b554f970c0d59c2c0d93bb63c116c Mon Sep 17 00:00:00 2001 From: SomTambe Date: Tue, 2 Feb 2021 06:33:24 +0000 Subject: [PATCH 5/7] Changed to if/ else if/ else. --- lib/cublas/linalg.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/cublas/linalg.jl b/lib/cublas/linalg.jl index 4fb6553da1..fad00ee14e 100644 --- a/lib/cublas/linalg.jl +++ b/lib/cublas/linalg.jl @@ -41,10 +41,10 @@ function LinearAlgebra.norm(x::DenseCuArray{<:CublasFloat}, p::Integer) if p==1 return CUBLAS.asum(length(x),x) end - if p==2 + else if p==2 return LinearAlgebra.norm(x) end - if p>2 + else return LinearAlgebra.tr(LinearAlgebra.Diagonal(abs.(x))^p)^(1/p) end end From f23d649a1a458fcc4fb21fb44908a68c4766f4a6 Mon Sep 17 00:00:00 2001 From: SomTambe Date: Tue, 2 Feb 2021 06:41:52 +0000 Subject: [PATCH 6/7] Corrected syntax. --- lib/cublas/linalg.jl | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/cublas/linalg.jl b/lib/cublas/linalg.jl index fad00ee14e..c55a106796 100644 --- a/lib/cublas/linalg.jl +++ b/lib/cublas/linalg.jl @@ -40,10 +40,8 @@ LinearAlgebra.BLAS.asum(x::StridedCuArray{<:CublasFloat}) = asum(length(x), x) function LinearAlgebra.norm(x::DenseCuArray{<:CublasFloat}, p::Integer) if p==1 return CUBLAS.asum(length(x),x) - end else if p==2 return LinearAlgebra.norm(x) - end else return LinearAlgebra.tr(LinearAlgebra.Diagonal(abs.(x))^p)^(1/p) end From c04d918395d228f6ba84abc6435fce8f4edcce4b Mon Sep 17 00:00:00 2001 From: SomTambe Date: Tue, 2 Feb 2021 06:47:34 +0000 Subject: [PATCH 7/7] Corrected syntax again. --- lib/cublas/linalg.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/cublas/linalg.jl b/lib/cublas/linalg.jl index c55a106796..a959fad268 100644 --- a/lib/cublas/linalg.jl +++ b/lib/cublas/linalg.jl @@ -40,7 +40,7 @@ LinearAlgebra.BLAS.asum(x::StridedCuArray{<:CublasFloat}) = asum(length(x), x) function LinearAlgebra.norm(x::DenseCuArray{<:CublasFloat}, p::Integer) if p==1 return CUBLAS.asum(length(x),x) - else if p==2 + elseif p==2 return LinearAlgebra.norm(x) else return LinearAlgebra.tr(LinearAlgebra.Diagonal(abs.(x))^p)^(1/p)