I'm having trouble using MKL in julia. I changed Make.inc so that USE_MKL =
1,
but when I make and run julia, I find that Base.libblas_name =
"libopenblas". Is this expected? I would have thought it would be eg
"libmkl_core".

Andreas, I found your wrappers for MKL in this
PR<https://github.com/JuliaLang/julia/pull/4525/files>.
I've not used MKL before, so I don't understand the call signature of those
functions in order to call MKL directly. Any chance you could explain what
are transa::BlasChar and matdescra::ASCIIString in the following function,
and which mkl library is expected in the libblas variable? I see many .so
files in the lib/intel64 directory of my mkl installation, and I'm not sure
which one to point julia to.

function cscmv!(transa::BlasChar, α::$T, matdescra::ASCIIString,
A::SparseMatrixCSC{$T, BlasInt}, x::StridedVector{$T}, β::$T,
y::StridedVector{$T})
length(x) == A.n || throw(DimensionMismatch("Matrix with $(A.n) columns
multiplied with vector of length $(length(x))"))
length(y) == A.m || throw(DimensionMismatch("Vector of length $(A.m) added
to vector of length $(length(y))")) #
ccall(($(string(mv)), libblas), Void,
(Ptr{Uint8}, Ptr{BlasInt}, Ptr{BlasInt}, Ptr{$T},
 Ptr{Uint8}, Ptr{$T}, Ptr{BlasInt}, Ptr{BlasInt},
 Ptr{BlasInt}, Ptr{$T}, Ptr{$T}, Ptr{$T}),
&transa, &A.m, &A.n, &α,
matdescra, A.nzval, A.rowval, pointer(A.colptr, 1),
pointer(A.colptr, 2), x, &β, y)
return y
end

Thanks for your help!
Madeleine


On Wed, Feb 5, 2014 at 1:49 PM, Andreas Noack Jensen <
[email protected]> wrote:

> A*b will not call MKL when A is sparse. There has been some writing about
> making a MKL package that overwrites A_mul_B(Matrix,Vector) with the MKL
> versions and I actually wrote wrappers for the sparse MKL subroutines in
> the fall for the same reason.
>
>
> 2014-02-05 Madeleine Udell <[email protected]>:
>
> Miles, you're right that writing sparse matrix vector products in native
>> Julia probably won't be the best idea given Julia's model of parallelism.
>> That's why I'm interested in calling an outside library like PETSc.
>>
>> I see it's possible to link Julia with MKL. I haven't tried this yet, but
>> if I do, will A*b (where A is sparse) call MKL to perform the matrix vector
>> product?
>>
>>
>> On Wed, Feb 5, 2014 at 11:43 AM, Miles Lubin <[email protected]>wrote:
>>
>>> Memory access is typically a significant bottleneck in sparse mat-vec,
>>> so unfortunately I'm skeptical that one could achieve good performance
>>> using Julia's current distributed memory approach on a multicore machine.
>>> This really calls for something like OpenMP.
>>>
>>>
>>> On Wednesday, February 5, 2014 11:42:00 AM UTC-5, Madeleine Udell wrote:
>>>>
>>>> I'm developing an iterative optimization algorithm in Julia along the
>>>> lines of other contributions to the Iterative Solvers 
>>>> project<https://github.com/JuliaLang/IterativeSolvers.jl>or Krylov
>>>> Subspace
>>>> <https://github.com/JuliaLang/IterativeSolvers.jl/blob/master/src/krylov.jl>module
>>>>  whose
>>>> only computationally intensive step is computing A*b or A'*b. I would like
>>>> to parallelize the method by using a parallel sparse matrix vector
>>>> multiply. Is there a standard backend matrix-vector multiply that's
>>>> recommended in Julia if I'm targeting a shared memory computer with a large
>>>> number of processors? Similarly, is there a recommended backend for
>>>> targeting a cluster? My matrices can easily reach 10 million rows by 1
>>>> million columns, with sparsity anywhere from .01% to problems that are
>>>> nearly diagonal.
>>>>
>>>> I've seen many posts <https://github.com/JuliaLang/julia/issues/2645> 
>>>> talking
>>>> about integrating PETSc as a backend for this purpose, but it looks like
>>>> the 
>>>> project<https://github.com/petsc/petsc/blob/master/bin/julia/PETSc.jl>has 
>>>> stalled - the last commits I see are a year ago. I'm also interested in
>>>> other backends, eg Spark <http://spark.incubator.apache.org/>, 
>>>> SciDB<http://scidb.org/>,
>>>> etc.
>>>>
>>>> I'm more interested in solving sparse problems, but as a side note, the
>>>> built-in BLAS acceleration by changing the number of threads 
>>>> `blas_set_num_threads`
>>>> works ok for dense problems using a moderate number of processors. I wonder
>>>> why the number of threads isn't set higher than one by default, for
>>>> example, using as many as nprocs() cores?
>>>>
>>>
>>
>>
>> --
>> Madeleine Udell
>> PhD Candidate in Computational and Mathematical Engineering
>> Stanford University
>> www.stanford.edu/~udell
>>
>
>
>
> --
> Med venlig hilsen
>
> Andreas Noack Jensen
>



-- 
Madeleine Udell
PhD Candidate in Computational and Mathematical Engineering
Stanford University
www.stanford.edu/~udell

Reply via email to