On Friday, September 26, 2014 2:50:51 AM UTC-5, Staro Pickle wrote: > > Thank you all. > > On Friday, September 26, 2014 2:50:56 AM UTC+8, Jason Riedy wrote: >> >> >> Others have given some reasons... If you want to see contortions >> that were (perhaps still are) necessary to be competitive, see: >> >> https://groups.google.com/forum/#!msg/julia-users/DJRxApmpJmU/NqepNaX5ARIJ >> > > This article is expert but as you say, they are not clear and straight. Is > it possible to call BLAS-3 an easy way? >
There are two ways to access BLAS subroutines from within Julia but neither is considered "easy". The first is direct calls to functions in the BLAS and LAPACK namespaces. The fact that these names are not exported means that they are not intended for general use. However, sometimes it is useful to access them directly. To find the available functions use julia> whos(BLAS) BLAS Module asum Function axpy! Function dot Function dotc Function dotu Function gbmv Function gbmv! Function gemm Function gemm! Function ger! Function her! Function her2k Function her2k! Function herk Function herk! Function iamax Function nrm2 Function sbmv Function sbmv! Function scal Function scal! Function symm Function symm! Function symv Function symv! Function syr! Function syr2k Function syr2k! Function syrk Function syrk! Function If you know the BLAS names you will see that these names are the same with the storage type indicator removed. So instead of the BLAS names cgemm, dgemm, sgemm and zgemm there is a single gemm function. The difference between the functions whose names end in ! and those whose names don't is that the name ending in ! is the mutating version of the function. It overwrites one of its arguments with the result. The name without the ! copies that argument before calling the mutating version. The functions are called as, e.g. julia> A = ones(5,5) 5x5 Array{Float64,2}: 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 julia> B = ones(5,2) 5x2 Array{Float64,2}: 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 julia> BLAS.gemm('N','N',1.0,A,B) 5x2 Array{Float64,2}: 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 5.0 julia> C = Array(Float64,(5,2)) 5x2 Array{Float64,2}: 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 julia> BLAS.gemm!('N','N',2.0,A,B,0.0,C) 5x2 Array{Float64,2}: 10.0 10.0 10.0 10.0 10.0 10.0 10.0 10.0 10.0 10.0 julia> C 5x2 Array{Float64,2}: 10.0 10.0 10.0 10.0 10.0 10.0 10.0 10.0 10.0 10.0 You can determine the calling sequence from a call like methods(gemm!) but the result isn't the most readable you will ever see. You may be better off reading the source code in src/linalg/blas.jl In that file you will see that these functions just marshal argument values for the Fortran calling conventions then call ccall to call the BLAS or LAPACK subroutine. That's the other way of calling BLAS or LAPACK directly, although it should not be necessary to drop down to that level of code. > >> However, if your matrices always have this form, I would highly >> recommend solving a few by hand to notice the pattern. >> > > Good observation and sense! Yes, I know that can be calculated by hand. I > use this matrix in a case related to sparse matrix. > > By the way, the citation above is not displayed grey as usual. I made a > few try but didn't see how. Should that text be chosen grey? >