RFR(M): Memory ordering in taskqueue.hpp

David Holmes david.holmes at oracle.com
Tue Dec 18 03:18:42 PST 2012


Hi Goetz,

On 18/12/2012 8:47 PM, Lindenmaier, Goetz wrote:
> Hi David,
>
> why do you think only these two accesses have to be ordered?

I didn't say that. I said these two need to be ordered and asked which 
other paired accesses to these variables need to be ordered.

> As I understand, any two accesses in one thread to these fields have to be
> orderered and must be written to memory to become visible in the proper order
> to other threads.

That depends on how they are used. It is the overall lock-free algorithm 
that is important here. There may be places where the order of access 
does not matter (and there may not be).

> The PPC compiler really takes all advantages given by the
> C-Standard to optimize this, and the processor reorders heavily.

Yes I understand. Though we have not run into this particular issue. Did 
it arise in the context of a particular GC?

> The specification of volatile in
>         Age get() const volatile { return _data; }
> says that it must be read from memory, not that it can not be reordered.

I didn't say anything about C/C++ volatile (which doesn't even say it 
must be read from memory - except perhaps in latest MT C++ standard?). I 
said that what you were doing was effectively treating the C++ variables 
as if they were Java volatile variables. That's not the way we handle 
these issues in the VM we tend to place fences/barriers at the places in 
lock-free algorithms that need them, rather than wrap the variables in 
accessors that impose fences/barriers that are not always needed.

Cheers,
David

> Also, doing
>        OrderAccess::load_acquire((volatile idx_t*)&(_age._fields._top))
> is better wrt. to optimizations by C-compilers, as there first
> is the whole address computation, and then the cast to volatile.
> If we use
>        _age.top()
> with
>        idx_t top() const volatile { return OrderAccess::load_acquire((volatile idx_t*)&(_fields._top); }
> compilers don't optimize that well.  (We saw this on hpia64.)
> Further, the access to, e.g., old_age.top() in pop_local_slow() would do
> the OrderAccess, which is useless overhead.
>
> Best regards,
>    Goetz.
>
>
> -----Original Message-----
> From: David Holmes [mailto:david.holmes at oracle.com]
> Sent: Dienstag, 18. Dezember 2012 01:24
> To: Lindenmaier, Goetz
> Cc: hotspot-dev at openjdk.java.net
> Subject: Re: RFR(M): Memory ordering in taskqueue.hpp
>
> Hi Goetz,
>
> On 17/12/2012 10:58 PM, Lindenmaier, Goetz wrote:
>> Hi,
>>
>> Once more, with webrev:
>> http://cr.openjdk.java.net/~goetz/webrevs/webrev-taskqueue/
>
> I can see that this function needs a storestore barrier:
>
>    237   void set_empty() {
>    238     _bottom = 0;
>    239     _age.set(0);
>    240   }
>
> to preserve ordering. Are there other functions to which we can
> constrain the loadload and storestore barriers rather than using the
> setters/getters the way you have defined? This is always about a pair
> (sometimes groups) of accesses so I'd rather deal with the pairs than
> treat each field as if it were a Java volatile.
>
> Thanks,
> David Holmes
>
>
>> Sorry for that.
>>
>> I would like to contribute fixes wrt. memory ordering in taskqueue.hpp.
>>
>> On Platfoms with weak memory ordering the taskqueue is not accessed
>> properly, as the accesses to the fields _bottom and _age are not ordered
>> correctly. Volatile is not sufficient to enforce this, because it depends on
>> what the compiler assumes to be necessary for volatile variables.
>>
>> The fix is to pull getter/setter routines from Age to TaskQueueSuper and use methods from
>> OrderAccess to access the fields in _age as well as _bottom.   Further the code must always
>> use the getter/setter methods to access _bottom, _age or the subfields of _age.
>> On the other hand we can relax constraints for accesses to locals oldAge and newAge.
>>
>> The OrderAccess routines do simple load/stores on x86_64.
>>
>> I want to discuss this change here and would like very much to see it taking
>> it's way into OpenJDK to support ports on platforms with weak memory
>> ordering, and, in particular, our PPC port.
>>
>> Best regards,
>>     Goetz.
>>
>>


More information about the hotspot-dev mailing list