Tim, thanks for the explanation! It looks like b = Base.shmem_randn(10) b[:] *= 2
should work without allocating new memory for normal and shared arrays, and is slightly more concise. On Wed, Feb 19, 2014 at 12:11 PM, Tim Holy <[email protected]> wrote: > Unfortunately, I'm pretty sure you can't do what you're hoping for. Consider: > > julia> A = rand(2,2) > 2x2 Array{Float64,2}: > 0.63259 0.109017 > 0.667425 0.112597 > > julia> pointer(A) > Ptr{Float64} @0x000000000446f6a0 > > julia> A *= 2 > 2x2 Array{Float64,2}: > 1.26518 0.218033 > 1.33485 0.225195 > > julia> pointer(A) > Ptr{Float64} @0x0000000005696650 > > I think A *= 2 gets translated by the parser into A = A*2. There are some old > posts that can do a better job than I explaining why this is important. > > So I think your only bet is to do something like this: > > for i = 1:length(A) > A[i] *= 2 > end > > which does work in-place. > > --Tim > > On Wednesday, February 19, 2014 11:26:48 AM Madeleine Udell wrote: >> Currently in-place arithmetic operations turn shared arrays into normal >> ones: eg >> >> b = Base.shmem_randn(10) >> b *= 2 >> >> results in b becoming a (not-shared) array. I'd like to overload these >> in-place arithmetic operations so that instead of writing >> >> typeof(b)==SharedArray? b.s *= 2 : b *= 2 >> >> I can just write >> >> b *= 2 >> >> and know that the shared status of my array will be preserved. How might >> one overload these operations? >> >> (Note: I don't want c = b + b to automatically create a shared array c, >> since that allocates new shared memory.) -- Madeleine Udell PhD Candidate in Computational and Mathematical Engineering Stanford University www.stanford.edu/~udell
