I am a little bit confused when trying to add precompile for svds in 
userimg.jl, since svds uses nsv as keyword arguments:

function svds{S}(X::S; nsv::Int = 6, ritzvec::Bool = true, tol::Float64 = 
0.0, maxiter::Int = 1000)

hence, calling svds maybe looks like: svds(X, nsv = 2), where X is a sparse 
matrix. In this case, does the following precompile code work as what I 
intended to?

precompile(svds, (SparseMatrixCSC{Float64,Int64}, Int64))

Surprisingly, I get no speed boost after rebuild julia with the precompile 
configuration. So I guess I must have missed something. In addition, I 
tried to precompile sprand function, and it did boost up quite a lot.

Cheers,
Todd Leo

On Wednesday, February 25, 2015 at 6:02:52 PM UTC+8, Tim Holy wrote:
>
> Keep in mind that compilation involves multiple stages: 
> - parsing 
> - lowering 
> - type inference 
> - generation of LLVM IR 
> - generation of machine native code 
>
> Just because it gets built into julia does not mean it goes through all of 
> those steps for all possible data types (in fact, that's not even possible 
> in 
> principle). The first two steps are the primary reason why "using Gadfly" 
> is 
> slow. The last 3 are the reasons why calling sprand the second time is 
> faster 
> than the first. 
>
> Like I said, look at base/precompile.jl. All of those functions are 
> built-in 
> to julia, so if there were no point in issuing those precompile 
> statements, 
> why would we bother having that file? 
>
> You could make your own userimg.jl file with 
>
> precompile(svds, (Matrix{Float64},)) 
>
> rebuild julia, and then I predict you'll get much faster response on the 
> first 
> use. But if you use matrices of different element types (other than 
> Float64), 
> you'll need to include those, too---the inferred, LLVM IR, and machine 
> native 
> code is specific for the element type. 
>
> --Tim 
>
>
>
> On Wednesday, February 25, 2015 01:14:53 AM Todd Leo wrote: 
> > That's exactly how I understand, and I'm using 0.4, so Tim's suggestion 
> > above won't work...I presume this is not related to the implementation 
> of 
> > svds, since other built-in functions also takes much more time and 
> memory 
> > on the first running: 
> > 
> > julia> @time sprand(5,5,0.1) 
> > elapsed time: 0.314905039 seconds (11 MB allocated) 
> > julia> @time sprand(5,5,0.1) 
> > elapsed time: 3.0776e-5 seconds (976 bytes allocated) 
> > 
> > 
> > Cheers, 
> > Todd Leo 
> > 
> > On Wednesday, February 25, 2015 at 5:00:21 PM UTC+8, Viral Shah wrote: 
> > > No need to precompile. svds was recently added to base - but it won't 
> > > exist in 0.3. 
> > > 
> > > -viral 
> > > 
> > > On Wednesday, February 25, 2015 at 12:32:09 PM UTC+5:30, Todd Leo 
> wrote: 
> > >> Isn't svd/svds already included in base? Do I need to precompile 
> them? 
> > >> 
> > >> On Saturday, February 7, 2015 at 3:48:50 AM UTC+8, Tim Holy wrote: 
> > >>> Since it allocates 120MB on the first call and only 9kB on the 
> second, 
> > >>> all that 
> > >>> memory is just due to compilation. 
> > >>> 
> > >>> The only way I know to fix that is to precompile some of the 
> functions 
> > >>> when you 
> > >>> build julia. If this is a big deal to you, consider adding your own 
> > >>> custom 
> > >>> userimg.jl (and see base/precompile.jl for a model). 
> > >>> 
> > >>> 
> > >>> 
> http://docs.julialang.org/en/latest/manual/modules/?highlight=userimg#mo 
> > >>> dule-initialization-and-precompilation 
> > >>> 
> > >>> --Tim 
> > >>> 
> > >>> On Friday, February 06, 2015 11:23:52 AM Viral Shah wrote: 
> > >>> > This is because the internal operations with svds are allocating 
> new 
> > >>> > vectors every iteration. This PR should address it, but needs to 
> be 
> > >>> > completed, 
> > >>> > 
> > >>> > https://github.com/JuliaLang/julia/pull/7907 
> > >>> > 
> > >>> > Also, array indexing giving views by default will also help here. 
> > >>> > 
> > >>> > -viral 
> > >>> > 
> > >>> > On Friday, February 6, 2015 at 7:50:24 PM UTC+5:30, Todd Leo 
> wrote: 
> > >>> > > Hi Julians, 
> > >>> > > 
> > >>> > > I am trying to apply svd on a very large sparse matrix using 
> svds. 
> > >>> 
> > >>> When 
> > >>> 
> > >>> > > warming up svds function, I used a very small random vector, and 
> the 
> > >>> > > number 
> > >>> > > of singular values (nsv) is set to one. However, this simple set 
> up 
> > >>> > > results 
> > >>> > > in a considerable high cost of time, and as much as 120MB memory 
> is 
> > >>> > > occupied. To me, it doesn't make sense, and one can reproduce it 
> by: 
> > >>> > > 
> > >>> > > julia> @time svds(sprand(3,3,0.1), nsv = 1) 
> > >>> > > 
> > >>> > >> elapsed time: 2.640233094 seconds (117 MB allocated, 1.06% gc 
> time 
> > >>> 
> > >>> in 5 
> > >>> 
> > >>> > >>> pauses with 0 full sweep) 
> > >>> > > 
> > >>> > > Regards, 
> > >>> > > Todd 
>
>

Reply via email to