On Mon, Nov 24, 2014 at 7:19 PM, Stefan Karpinski <[email protected]> wrote:
> Should the comparison actually be more like this:
>
> julia> @time begin
>            x = Array(Int,N)
>            fill!(x,1)
>        end;
> elapsed time: 6.782572096 seconds (8000000128 bytes allocated)
>
> julia> @time begin
>            x = zeros(Int,N)
>            fill!(x,1)
>        end;
> elapsed time: 14.166256835 seconds (8000000176 bytes allocated)
>
>
> At least that's the comparison that makes sense for code that allocates and
> then initializes an array. I consistently see a 2x slowdown or more.

My laptop can zero memory at 6+ GByte/sec. The overhead in your case
should be about ten times less than what you report. I suspect that
what you are measuring is not just the overhead of `zeros` over
`Array`, but something else as well.

Or Julia's `zeros` is not implemented efficiently. Zeroing memory is
surprisingly CPU intensive, and one has to call `memset`, or has to
ensure that the vectorizer kicks in, and may have to manually unroll
the loops. I'm not sure LLVM gets this right by default...

... yes, Julia's `zeros` is not as good as it should be. It calls
`fill!`, but the generated machine code leaves to be desired. Time to
add a special case to `fill!`, delegating things to `memset` in
certain cases?

-erik

-- 
Erik Schnetter <[email protected]>
http://www.perimeterinstitute.ca/personal/eschnetter/

Reply via email to