Is there a version of copy!() that uses @parallel? My x and x_next are usually huge.
On Thursday, 2 October 2014 18:32:32 UTC-4, Roy Wang wrote: > > Hey John, > > Ah geez, copy!() was only 2 lines lower than copy() in abstractarray.jl. > Thanks! > > > On Thursday, 2 October 2014 18:25:22 UTC-4, John Myles White wrote: >> >> Why not use copy! >> >> -- John >> >> On Oct 2, 2014, at 3:24 PM, Roy Wang <[email protected]> wrote: >> >> >> This kind of routine is what I'm talking about... >> >> # copy assignment for vectors >> function copyassignment!(a::Vector,b::Vector) >> @assert length(a) == length(b) >> for n=1:length(a) >> a[n]=b[n]; >> end >> end >> >> My questions: >> 1) Is there a standard function that does this? >> 2) Is there a better way to do this so it'll handle any type of >> multi-dimensional array of integers and floats without performance penalty? >> >> >> On Thursday, 2 October 2014 18:09:16 UTC-4, Roy Wang wrote: >>> >>> I often need a "copy assignment" type of operation to an existing >>> destination array of the exact same element type and size. Let's only talk >>> about arrays of concrete types, like a multi-dimensional array of floats. >>> This is useful when I write optimization solvers, and I need to store >>> vectors or matrices from the previous step. I usually pre-allocate a pair >>> of arrays of the same type and size, *x* and *x_next*, then do: >>> >>> *x_next = x;* >>> >>> at the end of each iteration of my solver. >>> >>> At first, I thought using *copy()* (shallow copy) on them is fine to >>> make sure they are separate entities, since floating point numbers and >>> integers are concrete types in Julia. While I verified this is true (at >>> least on arrays of Float64s), I looked at (around line 202 at the time of >>> this post), and *copy()* seems to call *copy!( similar(a), a)*. To my >>> understanding, this allocates a new destination array, fills it with the >>> corresponding values from the source array, then assigns the pointer of >>> this new destination array to *x_next*, and the garbage collector >>> removes the old array that *x_next* was pointing to. This is a lot of >>> work when I just want to traverse through *x_next*, and assign it the >>> corresponding values from* x*. Please correct me if my understanding is >>> wrong! >>> >>> This is a really common operation. I'd appreciate it if someone can >>> advise me whether there is already an existing method for doing this (or a >>> better solution) before I write my own. >>> >>> Cheers, >>> >>> Roy >>> >> >>
