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

Reply via email to