Le jeudi 02 octobre 2014 à 13:51 -0700, Jürgen Bohnert a écrit :
> Hi everyone,
> 
> I'm new to using julia and I would be grateful if anyone could shed
> some light on the following performance-issue that I cannot explain.
> For some reason wrapping 2 for-loops into a separate function and then
> calling that function is 2 times slower than executing the for-loops
> directly.
> 
> My goal:
> Perform timeconsuming but easily parallelizable operation 'operator'
> over moderate/large parameter-space on a SINGLE Machine with multiple
> cores. -> Put loops into function and call 'pmap' on that.
> 
> 
> function operator(x::Float64, y::Float64,
> extraparameters::Float64 ...)
>         # ... Does something
>         # returns Float64 scalar
> end
> 
> 
> 
> The function 'operator' works like a charm and fast.
> 
> What I did:
> Execution over a parameter-space:  x::Array{Float64, 1},
> y::Array{Float64, 1}
> via the function 'loops_simple' (below)
> 
> 
> function loops_simple(different_arguments ...)
> 
>     # generate x::Array{Float64, 1} and y::Array{Float64, 1} and
> extraparameters
>     # preallocate output container
>     output = Array(Float64, (length(x), length(y)))
> 
>     t = time()
> 
>     for i=1:length(y)
>         for j=1:length(x)
>             output[j,i] = operator(x[j], y[i], extraparameters ...)
>         end
>     end
> 
>     t = time() - t
>     println("time taken: $t")
> 
>     return output
> end
> 
> 
> 
> This runs really fast as expected. Trouble comes as soon as I stuff
> the loops into a separate function 'wrapper' (for easier parallel
> execution but I didn't get that far.).
> 
> 
> function wrapper(x::Array{Float64, 1}, y::Array{Float64, 1},
> extraparameters::Float64 ...)
>     output = Array(Float64, (length(x), length(y)))
>     for i=1:length(y)
>         for j=1:length(x)
>             output[j,i] = operator (x[j], y[i], extraparameters ...)
>         end
>     end
> end
> 
> 
> 
> 
> Now calling:
> 
> 
> function loops_wrapped(different_arguments ...)
>     # generate x::Array{Float64, 1} and y::Array{Float64, 1} and
> extraparameters
>     t = time()
>     output = wrapper (x, y, extraparameters ...)
>     t = time() - t
>     println("time taken: $t")
> 
>     return output
> end
> 
> 
> 
> the process ends up taking twice the time of the 'loops_simple' case.
> Can anyone explain what I'm doing wrong?

I think you're going to get many replies if you manage to post a short
reproducible example somewhere, e.g. in a GitHub gist. It's hard to tell
what's happening without seeing a concrete piece of code in action.


Regards


> Thanks in advance.
> 
> I'm running julia Version 0.4.0-dev+584; Commit 114abf4;
> x86_64-linux-gnu
> 

Reply via email to