From 47cf2b44ac7cd726a2fc4829e3501826a837f9fe Mon Sep 17 00:00:00 2001 From: Andreas Noack Date: Wed, 9 Jan 2019 17:38:59 +0100 Subject: [PATCH 1/4] Bump to Julia 0.7 and remove Compat --- REQUIRE | 3 +-- src/BLAS/BLAS.jl | 2 -- src/BLAS/level_2_3/matmul.jl | 12 ++++++------ 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/REQUIRE b/REQUIRE index 23848d5..859ad46 100644 --- a/REQUIRE +++ b/REQUIRE @@ -1,2 +1 @@ -julia 0.5 -Compat 0.18 +julia 0.7 diff --git a/src/BLAS/BLAS.jl b/src/BLAS/BLAS.jl index 0b8cbf5..1739d63 100644 --- a/src/BLAS/BLAS.jl +++ b/src/BLAS/BLAS.jl @@ -1,7 +1,5 @@ module BLAS -using Compat - import Base.LinAlg: checksquare, UnitLowerTriangular, UnitUpperTriangular, BlasInt, BlasFloat # For testing purposes: diff --git a/src/BLAS/level_2_3/matmul.jl b/src/BLAS/level_2_3/matmul.jl index 599fabe..58dc69a 100644 --- a/src/BLAS/level_2_3/matmul.jl +++ b/src/BLAS/level_2_3/matmul.jl @@ -7,12 +7,12 @@ _get_data(A::UnitLowerTriangular) = tril(A.data) _get_data(A::UnitUpperTriangular) = triu(A.data) _get_data(A::Symmetric) = A.data -@compat const SparseMatrices{T} = Union{SparseMatrixCSC{T,BlasInt}, - Symmetric{T,SparseMatrixCSC{T,BlasInt}}, - LowerTriangular{T, SparseMatrixCSC{T,BlasInt}}, - UnitLowerTriangular{T, SparseMatrixCSC{T,BlasInt}}, - UpperTriangular{T, SparseMatrixCSC{T,BlasInt}}, - UnitUpperTriangular{T, SparseMatrixCSC{T,BlasInt}}} +const SparseMatrices{T} = Union{SparseMatrixCSC{T,BlasInt}, + Symmetric{T,SparseMatrixCSC{T,BlasInt}}, + LowerTriangular{T, SparseMatrixCSC{T,BlasInt}}, + UnitLowerTriangular{T, SparseMatrixCSC{T,BlasInt}}, + UpperTriangular{T, SparseMatrixCSC{T,BlasInt}}, + UnitUpperTriangular{T, SparseMatrixCSC{T,BlasInt}}} for T in [Complex{Float32}, Complex{Float64}, Float32, Float64] for mat in (:StridedVector, :StridedMatrix) From 5979b0785f33411f05fdc2dc24df5c39a006e3a7 Mon Sep 17 00:00:00 2001 From: Andreas Noack Date: Wed, 9 Jan 2019 17:43:33 +0100 Subject: [PATCH 2/4] Run Femto --- src/BLAS/level_2_3/generator.jl | 48 ++++++++++++++++----------------- src/MKLSparse.jl | 2 -- test/test_BLAS.jl | 8 +++--- 3 files changed, 28 insertions(+), 30 deletions(-) diff --git a/src/BLAS/level_2_3/generator.jl b/src/BLAS/level_2_3/generator.jl index b4d4f0c..dccf821 100644 --- a/src/BLAS/level_2_3/generator.jl +++ b/src/BLAS/level_2_3/generator.jl @@ -38,13 +38,13 @@ function cscmv!(transa::Char, α::$T, matdescra::String, _check_transa(transa) _check_mat_mult_matvec(y, A, x, transa) __counter[] += 1 - ccall(($(string(mv)), :libmkl_rt), Void, - (Ptr{UInt8}, Ptr{BlasInt}, Ptr{BlasInt}, Ptr{$T}, + ccall(($(string(mv)), :libmkl_rt), Cvoid, + (Ref{UInt8}, Ref{BlasInt}, Ref{BlasInt}, Ref{$T}, Ptr{UInt8}, Ptr{$T}, Ptr{BlasInt}, Ptr{BlasInt}, - Ptr{BlasInt}, Ptr{$T}, Ptr{$T}, Ptr{$T}), - &transa, &A.m, &A.n, &α, + Ptr{BlasInt}, Ptr{$T}, Ref{$T}, Ptr{$T}), + transa, A.m, A.n, α, matdescra, A.nzval, A.rowval, pointer(A.colptr, 1), - pointer(A.colptr, 2), x, &β, y) + pointer(A.colptr, 2), x, β, y) return y end @@ -56,15 +56,15 @@ function cscmm!(transa::Char, α::$T, matdescra::String, mB, nB = size(B) mC, nC = size(C) __counter[] += 1 - ccall(($(string(mm)), :libmkl_rt), Void, - (Ptr{UInt8}, Ptr{BlasInt}, Ptr{BlasInt}, Ptr{BlasInt}, - Ptr{$T}, Ptr{UInt8}, Ptr{$T}, Ptr{BlasInt}, - Ptr{BlasInt}, Ptr{BlasInt}, Ptr{$T}, Ptr{BlasInt}, - Ptr{$T}, Ptr{$T}, Ptr{BlasInt}), - &transa, &A.m, &nC, &A.n, - &α, matdescra, A.nzval, A.rowval, - pointer(A.colptr, 1), pointer(A.colptr, 2), B, &mB, - &β, C, &mC) + ccall(($(string(mm)), :libmkl_rt), Cvoid, + (Ref{UInt8}, Ref{BlasInt}, Ref{BlasInt}, Ref{BlasInt}, + Ref{$T}, Ptr{UInt8}, Ptr{$T}, Ptr{BlasInt}, + Ptr{BlasInt}, Ptr{BlasInt}, Ptr{$T}, Ref{BlasInt}, + Ref{$T}, Ptr{$T}, Ref{BlasInt}), + transa, A.m, nC, A.n, + α, matdescra, A.nzval, A.rowval, + pointer(A.colptr, 1), pointer(A.colptr, 2), B, mB, + β, C, mC) return C end @@ -75,11 +75,11 @@ function cscsv!(transa::Char, α::$T, matdescra::String, _check_transa(transa) _check_mat_mult_matvec(y, A, x, transa) __counter[] += 1 - ccall(($(string(sv)), :libmkl_rt), Void, - (Ptr{UInt8}, Ptr{BlasInt}, Ptr{$T}, Ptr{UInt8}, + ccall(($(string(sv)), :libmkl_rt), Cvoid, + (Ref{UInt8}, Ref{BlasInt}, Ref{$T}, Ptr{UInt8}, Ptr{$T}, Ptr{BlasInt}, Ptr{BlasInt}, Ptr{BlasInt}, Ptr{$T}, Ptr{$T}), - &transa, &A.m, &α, matdescra, + transa, A.m, α, matdescra, A.nzval, A.rowval, pointer(A.colptr, 1), pointer(A.colptr, 2), x, y) return y @@ -94,15 +94,15 @@ function cscsm!(transa::Char, α::$T, matdescra::String, _check_transa(transa) _check_mat_mult_matvec(C, A, B, transa) __counter[] += 1 - ccall(($(string(sm)), :libmkl_rt), Void, - (Ptr{UInt8}, Ptr{BlasInt}, Ptr{BlasInt}, Ptr{$T}, + ccall(($(string(sm)), :libmkl_rt), Cvoid, + (Ref{UInt8}, Ref{BlasInt}, Ref{BlasInt}, Ref{$T}, Ptr{UInt8}, Ptr{$T}, Ptr{BlasInt}, Ptr{BlasInt}, - Ptr{BlasInt}, Ptr{$T}, Ptr{BlasInt}, Ptr{$T}, - Ptr{BlasInt}), - &transa, &A.n, &nC, &α, + Ptr{BlasInt}, Ptr{$T}, Ref{BlasInt}, Ptr{$T}, + Ref{BlasInt}), + transa, A.n, nC, α, matdescra, A.nzval, A.rowval, pointer(A.colptr, 1), - pointer(A.colptr, 2), B, &mB, C, - &mC) + pointer(A.colptr, 2), B, mB, C, + mC) return C end diff --git a/src/MKLSparse.jl b/src/MKLSparse.jl index f4f76d1..4e75707 100644 --- a/src/MKLSparse.jl +++ b/src/MKLSparse.jl @@ -1,5 +1,3 @@ -__precompile__() - module MKLSparse function __init__() diff --git a/test/test_BLAS.jl b/test/test_BLAS.jl index 06fa2ea..ffc5f48 100644 --- a/test/test_BLAS.jl +++ b/test/test_BLAS.jl @@ -1,7 +1,7 @@ module Matdescra using MKLSparse -using Base.Test +using Test sA = sprand(5, 5, 0.01) sS = sA'sA @@ -24,7 +24,7 @@ import Base.LinAlg: UnitLowerTriangular, UnitUpperTriangular using MKLSparse -using Base.Test +using Test macro test_blas(ex) return quote @@ -57,8 +57,8 @@ end b = randn(5,3) + im*randn(5,3) c = randn(5) + im*randn(5) d = randn(5) + im*randn(5) - α = rand(Complex128) - β = rand(Complex128) + α = rand(ComplexF64) + β = rand(ComplexF64) @test_blas (maximum(abs.(a*b - Array(a)*b)) < 100*eps()) @test_blas (maximum(abs.(a'*b - Array(a)'*b)) < 100*eps()) @test_blas (maximum(abs.(a.'*b - Array(a).'*b)) < 100*eps()) From 86d44bb99e24071af67744cd18e53f7721d1d333 Mon Sep 17 00:00:00 2001 From: Andreas Noack Date: Wed, 9 Jan 2019 22:13:10 +0100 Subject: [PATCH 3/4] Adjust to Adjoint and Transpose --- src/BLAS/BLAS.jl | 3 +- src/BLAS/level_2_3/generator.jl | 4 +- src/BLAS/level_2_3/matmul.jl | 109 +++++++++++++++++++------------- test/test_BLAS.jl | 43 ++++++------- 4 files changed, 90 insertions(+), 69 deletions(-) diff --git a/src/BLAS/BLAS.jl b/src/BLAS/BLAS.jl index 1739d63..055c520 100644 --- a/src/BLAS/BLAS.jl +++ b/src/BLAS/BLAS.jl @@ -1,6 +1,7 @@ module BLAS -import Base.LinAlg: checksquare, UnitLowerTriangular, UnitUpperTriangular, BlasInt, BlasFloat +using LinearAlgebra, SparseArrays +using LinearAlgebra: BlasInt, checksquare # For testing purposes: global const __counter = Ref(0) diff --git a/src/BLAS/level_2_3/generator.jl b/src/BLAS/level_2_3/generator.jl index dccf821..2a5279a 100644 --- a/src/BLAS/level_2_3/generator.jl +++ b/src/BLAS/level_2_3/generator.jl @@ -29,8 +29,8 @@ end for (mv, sv, mm, sm, T) in ((:mkl_scscmv, :mkl_scscsv, :mkl_scscmm, :mkl_scscsm, :Float32), (:mkl_dcscmv, :mkl_dcscsv, :mkl_dcscmm, :mkl_dcscsm, :Float64), - (:mkl_ccscmv, :mkl_ccscsv, :mkl_ccscmm, :mkl_ccscsm, :Complex64), - (:mkl_zcscmv, :mkl_zcscsv, :mkl_zcscmm, :mkl_zcscsm, :Complex128)) + (:mkl_ccscmv, :mkl_ccscsv, :mkl_ccscmm, :mkl_ccscsm, :ComplexF32), + (:mkl_zcscmv, :mkl_zcscsv, :mkl_zcscmm, :mkl_zcscsm, :ComplexF64)) @eval begin function cscmv!(transa::Char, α::$T, matdescra::String, A::SparseMatrixCSC{$T, BlasInt}, x::StridedVector{$T}, diff --git a/src/BLAS/level_2_3/matmul.jl b/src/BLAS/level_2_3/matmul.jl index 58dc69a..62ae9e1 100644 --- a/src/BLAS/level_2_3/matmul.jl +++ b/src/BLAS/level_2_3/matmul.jl @@ -1,5 +1,5 @@ -import Base: *, A_mul_B!, At_mul_B!, Ac_mul_B!, Ac_mul_B, At_mul_B -import Base: \, A_ldiv_B!, At_ldiv_B!, Ac_ldiv_B!, Ac_ldiv_B, At_ldiv_B +import Base: *, \ +import LinearAlgebra: mul!, ldiv! _get_data(A::LowerTriangular) = tril(A.data) _get_data(A::UpperTriangular) = triu(A.data) @@ -7,6 +7,9 @@ _get_data(A::UnitLowerTriangular) = tril(A.data) _get_data(A::UnitUpperTriangular) = triu(A.data) _get_data(A::Symmetric) = A.data +_unwrap_adj(x::Union{Adjoint,Transpose}) = parent(x) +_unwrap_adj(x) = x + const SparseMatrices{T} = Union{SparseMatrixCSC{T,BlasInt}, Symmetric{T,SparseMatrixCSC{T,BlasInt}}, LowerTriangular{T, SparseMatrixCSC{T,BlasInt}}, @@ -16,62 +19,82 @@ const SparseMatrices{T} = Union{SparseMatrixCSC{T,BlasInt}, for T in [Complex{Float32}, Complex{Float64}, Float32, Float64] for mat in (:StridedVector, :StridedMatrix) -for (trans, F!, F) in (('N', :A_mul_B! , :*), - ('C', :Ac_mul_B!, :Ac_mul_B), - ('T', :At_mul_B!, :At_mul_B)) +for (tchar, ttype) in (('N', :()), + ('C', :Adjoint), + ('T', :Transpose)) + AT = tchar == 'N' ? :(SparseMatrixCSC{$T,BlasInt}) : :($ttype{$T,SparseMatrixCSC{$T,BlasInt}}) @eval begin - function $F!(α::$T, A::SparseMatrixCSC{$T, BlasInt}, - B::$mat{$T}, β::$T, C::$mat{$T}) - isa(B,AbstractVector) ? - cscmv!($trans, α, matdescra(A), A, B, β, C) : - cscmm!($trans, α, matdescra(A), A, B, β, C) + function mul!(α::$T, adjA::$AT, + B::$mat{$T}, β::$T, C::$mat{$T}) + A = _unwrap_adj(adjA) + if isa(B, AbstractVector) + return cscmv!($tchar, α, matdescra(A), A, B, β, C) + else + return cscmm!($tchar, α, matdescra(A), A, B, β, C) + end end - function $F!(C::$mat{$T}, A::SparseMatrices{$T}, - B::$mat{$T}) - $F!(one($T), A, B, zero($T), C) - end + mul!(C::$mat{$T}, adjA::$AT, B::$mat{$T}) = mul!(one($T), adjA, B, zero($T), C) - function $F(A::SparseMatrices{$T}, B::$mat{$T}) - isa(B,AbstractVector) ? - $F!(zeros($T, mkl_size($trans, A)[1]), A, B) : - $F!(zeros($T, mkl_size($trans, A)[1], size(B,2)), A, B) + function (*)(adjA::$AT, B::$mat{$T}) + A = _unwrap_adj(adjA) + if isa(B,AbstractVector) + return mul!(zeros($T, mkl_size($tchar, A)[1]), adjA, B) + else + return mul!(zeros($T, mkl_size($tchar, A)[1], size(B,2)), adjA, B) + end end end for w in (:Symmetric, :LowerTriangular, :UnitLowerTriangular, :UpperTriangular, :UnitUpperTriangular) + AT = tchar == 'N' ? + :($w{$T,SparseMatrixCSC{$T,BlasInt}}) : + :($ttype{$T,$w{$T,SparseMatrixCSC{$T,BlasInt}}}) @eval begin - function $F!(α::$T, A::$w{$T, SparseMatrixCSC{$T, BlasInt}}, + function mul!(α::$T, adjA::$AT, B::$mat{$T}, β::$T, C::$mat{$T}) - isa(B,AbstractVector) ? - cscmv!($trans, α, matdescra(A), _get_data(A), B, β, C) : - cscmm!($trans, α, matdescra(A), _get_data(A), B, β, C) + A = _unwrap_adj(adjA) + if isa(B,AbstractVector) + return cscmv!($tchar, α, matdescra(A), _get_data(A), B, β, C) + else + return cscmm!($tchar, α, matdescra(A), _get_data(A), B, β, C) + end end - end - end -end -for (trans, F!, F) in (('N', :A_ldiv_B! , :\), - ('C', :Ac_ldiv_B!, :Ac_ldiv_B), - ('T', :At_ldiv_B!, :At_ldiv_B)) - for w in (:LowerTriangular, :UnitLowerTriangular, :UpperTriangular, :UnitUpperTriangular) - @eval begin - function $F!(α::$T, A::$w{$T, SparseMatrixCSC{$T, BlasInt}}, - B::$mat{$T}, C::$mat{$T}) - isa(B,AbstractVector) ? - cscsv!($trans, α, matdescra(A), _get_data(A), B, C) : - cscsm!($trans, α, matdescra(A), _get_data(A), B, C) - end + mul!(C::$mat{$T}, adjA::$AT, B::$mat{$T}) = mul!(one($T), adjA, B, zero($T), C) - function $F!(C::$mat{$T}, A::$w{$T, SparseMatrixCSC{$T, BlasInt}}, - B::$mat{$T}) - $F!(one($T), A, B, C) + function (*)(adjA::$AT, B::$mat{$T}) + A = _unwrap_adj(adjA) + if isa(B,AbstractVector) + return mul!(zeros($T, mkl_size($tchar, A)[1]), adjA, B) + else + return mul!(zeros($T, mkl_size($tchar, A)[1], size(B,2)), adjA, B) + end end + end + + if w != :Symmetric + @eval begin + function ldiv!(α::$T, adjA::$AT, + B::$mat{$T}, C::$mat{$T}) + A = _unwrap_adj(adjA) + if isa(B,AbstractVector) + return cscsv!($tchar, α, matdescra(A), _get_data(A), B, C) + else + return cscsm!($tchar, α, matdescra(A), _get_data(A), B, C) + end + end + + ldiv!(C::$mat{$T}, A::$AT, B::$mat{$T}) = + ldiv!(one($T), A, B, C) - function $F(A::$w{$T, SparseMatrixCSC{$T, BlasInt}}, B::$mat{$T}) - isa(B,AbstractVector) ? - $F!(zeros($T, size(A,1)), A, B) : - $F!(zeros($T, size(A,1), size(B,2)), A, B) + function (\)(A::$AT, B::$mat{$T}) + if isa(B,AbstractVector) + return ldiv!(zeros($T, size(A,1)), A, B) + else + return ldiv!(zeros($T, size(A,1), size(B,2)), A, B) + end + end end end end diff --git a/test/test_BLAS.jl b/test/test_BLAS.jl index ffc5f48..64b6d35 100644 --- a/test/test_BLAS.jl +++ b/test/test_BLAS.jl @@ -1,30 +1,27 @@ module Matdescra using MKLSparse -using Test +using Test, SparseArrays, LinearAlgebra sA = sprand(5, 5, 0.01) sS = sA'sA sTl = tril(sS) sTu = triu(sS) -@test MKLSparse.BLAS.matdescra(Base.LinAlg.Symmetric(sTl,:L)) == "SLNF" -@test MKLSparse.BLAS.matdescra(Base.LinAlg.Symmetric(sTu,:U)) == "SUNF" -@test MKLSparse.BLAS.matdescra(Base.LinAlg.LowerTriangular(sTl)) == "TLNF" -@test MKLSparse.BLAS.matdescra(Base.LinAlg.UpperTriangular(sTu)) == "TUNF" -@test MKLSparse.BLAS.matdescra(Base.LinAlg.UnitLowerTriangular(sTl)) == "TLUF" -@test MKLSparse.BLAS.matdescra(Base.LinAlg.UnitUpperTriangular(sTu)) == "TUUF" +@test MKLSparse.BLAS.matdescra(Symmetric(sTl,:L)) == "SLNF" +@test MKLSparse.BLAS.matdescra(Symmetric(sTu,:U)) == "SUNF" +@test MKLSparse.BLAS.matdescra(LowerTriangular(sTl)) == "TLNF" +@test MKLSparse.BLAS.matdescra(UpperTriangular(sTu)) == "TUNF" +@test MKLSparse.BLAS.matdescra(UnitLowerTriangular(sTl)) == "TLUF" +@test MKLSparse.BLAS.matdescra(UnitUpperTriangular(sTu)) == "TUUF" @test MKLSparse.BLAS.matdescra(sA) == "GUUF" end # module module BLAS -import Base.LinAlg: UnitLowerTriangular, UnitUpperTriangular - - using MKLSparse -using Test +using Test, LinearAlgebra, SparseArrays macro test_blas(ex) return quote @@ -43,17 +40,17 @@ end @test_blas maximum(abs.(a*b - Array(a)*b)) < 100*eps() b = rand(10) @test_blas maximum(abs.(a'*b - Array(a)'*b)) < 100*eps() - @test_blas maximum(abs.(a.'*b - Array(a)'*b)) < 100*eps() + @test_blas maximum(abs.(transpose(a)*b - Array(a)'*b)) < 100*eps() b = rand(10,10) @test_blas maximum(abs.(a'*b - Array(a)'*b)) < 100*eps() - @test_blas maximum(abs.(a.'*b - Array(a)'*b)) < 100*eps() + @test_blas maximum(abs.(transpose(a)*b - Array(a)'*b)) < 100*eps() end end #? @testset "complex matrix-vector multiplication" begin for i = 1:5 - a = speye(5) + im * 0.1*sprandn(5, 5, 0.2) + a = I + im * 0.1*sprandn(5, 5, 0.2) b = randn(5,3) + im*randn(5,3) c = randn(5) + im*randn(5) d = randn(5) + im*randn(5) @@ -61,14 +58,14 @@ end β = rand(ComplexF64) @test_blas (maximum(abs.(a*b - Array(a)*b)) < 100*eps()) @test_blas (maximum(abs.(a'*b - Array(a)'*b)) < 100*eps()) - @test_blas (maximum(abs.(a.'*b - Array(a).'*b)) < 100*eps()) - @test_blas (maximum(abs.(A_mul_B!(similar(b), a, b) - Array(a)*b)) < 100*eps()) - @test_blas (maximum(abs.(A_mul_B!(similar(c), a, c) - Array(a)*c)) < 100*eps()) - @test_blas (maximum(abs.(At_mul_B!(similar(b), a, b) - Array(a).'*b)) < 100*eps()) - @test_blas (maximum(abs.(At_mul_B!(similar(c), a, c) - Array(a).'*c)) < 100*eps()) + @test_blas (maximum(abs.(transpose(a)*b - transpose(Array(a))*b)) < 100*eps()) + @test_blas (maximum(abs.(mul!(similar(b), a, b) - Array(a)*b)) < 100*eps()) + @test_blas (maximum(abs.(mul!(similar(c), a, c) - Array(a)*c)) < 100*eps()) + @test_blas (maximum(abs.(mul!(similar(b), transpose(a), b) - transpose(Array(a))*b)) < 100*eps()) + @test_blas (maximum(abs.(mul!(similar(c), transpose(a), c) - transpose(Array(a))*c)) < 100*eps()) c = randn(6) + im*randn(6) - @test_throws DimensionMismatch a.'*c + @test_throws DimensionMismatch transpose(a)*c @test_throws DimensionMismatch a.*c @test_throws DimensionMismatch a.*c end @@ -78,11 +75,11 @@ end n = 100 A = sprandn(n, n, 0.5) + sqrt(n)*I b = rand(n) - symA = A + A.' + symA = A + transpose(A) trilA = tril(A) triuA = triu(A) - trilUA = tril(A, -1) + speye(A) - triuUA = triu(A, 1) + speye(A) + trilUA = tril(A, -1) + I + triuUA = triu(A, 1) + I @test_blas LowerTriangular(trilA) \ b ≈ Array(LowerTriangular(trilA)) \ b @test_blas LowerTriangular(trilA) * b ≈ Array(LowerTriangular(trilA)) * b From 4d63e62f4b053b65c5036dfeffc0933ef672cdc4 Mon Sep 17 00:00:00 2001 From: Andreas Noack Date: Thu, 10 Jan 2019 08:34:42 +0100 Subject: [PATCH 4/4] Make sure that colptr array isn't freed by the gc while calling MKL --- src/BLAS/level_2_3/generator.jl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/BLAS/level_2_3/generator.jl b/src/BLAS/level_2_3/generator.jl index 2a5279a..eaaf9b5 100644 --- a/src/BLAS/level_2_3/generator.jl +++ b/src/BLAS/level_2_3/generator.jl @@ -43,7 +43,7 @@ function cscmv!(transa::Char, α::$T, matdescra::String, Ptr{UInt8}, Ptr{$T}, Ptr{BlasInt}, Ptr{BlasInt}, Ptr{BlasInt}, Ptr{$T}, Ref{$T}, Ptr{$T}), transa, A.m, A.n, α, - matdescra, A.nzval, A.rowval, pointer(A.colptr, 1), + matdescra, A.nzval, A.rowval, A.colptr, pointer(A.colptr, 2), x, β, y) return y end @@ -63,7 +63,7 @@ function cscmm!(transa::Char, α::$T, matdescra::String, Ref{$T}, Ptr{$T}, Ref{BlasInt}), transa, A.m, nC, A.n, α, matdescra, A.nzval, A.rowval, - pointer(A.colptr, 1), pointer(A.colptr, 2), B, mB, + A.colptr, pointer(A.colptr, 2), B, mB, β, C, mC) return C end @@ -80,7 +80,7 @@ function cscsv!(transa::Char, α::$T, matdescra::String, Ptr{$T}, Ptr{BlasInt}, Ptr{BlasInt}, Ptr{BlasInt}, Ptr{$T}, Ptr{$T}), transa, A.m, α, matdescra, - A.nzval, A.rowval, pointer(A.colptr, 1), pointer(A.colptr, 2), + A.nzval, A.rowval, A.colptr, pointer(A.colptr, 2), x, y) return y end @@ -100,7 +100,7 @@ function cscsm!(transa::Char, α::$T, matdescra::String, Ptr{BlasInt}, Ptr{$T}, Ref{BlasInt}, Ptr{$T}, Ref{BlasInt}), transa, A.n, nC, α, - matdescra, A.nzval, A.rowval, pointer(A.colptr, 1), + matdescra, A.nzval, A.rowval, A.colptr, pointer(A.colptr, 2), B, mB, C, mC) return C