----- Original Message ----- > From: "Laurynas Biveinis" <[email protected]> > To: "mechanical-sympathy" <[email protected]> > Sent: Saturday, June 4, 2022 11:03:28 AM > Subject: Re: Compute in a lock free way
>> I am writing a class to calculate average of prices. We use it to generate >> buy/sell signal for some financial instruments therefore latency is crucial. >> Prices are sent via different threads therefore class needs to be >> thread-safe. >> >> Am I correct in understanding that I have to use a lock to make the two >> operations (adding and incrementing) atomic? I have looked at >> AtomicLong/LongAdder/LongAccumulator but looks like they can only sum the >> numbers atomically. >> >> In other words, there is no way to do this in a lock-free manner? > > I am not much of an expert here but I have done exactly this. The mean > and count were packed into a single 128-bit value, which was then > updated with x86_64 DWCAS operation (LOCK CMPXCHG16B). It was slower > than a locking version though. I think that is because 1) 128-bit > atomics are more limited than 64-bit ones on x86_64, i.e. to load the > 128 bit value you still have to do CAS instead of simple load, > resulting in a more expensive implementation; You do not have to, on x86_64 the SIMD mov operations are atomic on 128 bits. > 2) under high concurrency this implementation trades a contended lock for a > contended 128-bit atomic, gaining nothing for scalability. To scale, > I'd look into per-thread averages with occasional global aggregation, > but I'm not sure your use case allows this > > > -- > Laurynas Rémi > > -- > You received this message because you are subscribed to the Google Groups > "mechanical-sympathy" group. > To unsubscribe from this group and stop receiving emails from it, send an > email > to [email protected]. > To view this discussion on the web, visit > https://groups.google.com/d/msgid/mechanical-sympathy/CAHkCEVePWi7ZQ6UagR_WX%2B_fJeGR3yLeC1td02nZHV_iKH%2Bgeg%40mail.gmail.com. -- You received this message because you are subscribed to the Google Groups "mechanical-sympathy" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web, visit https://groups.google.com/d/msgid/mechanical-sympathy/393058532.2017386.1654335563970.JavaMail.zimbra%40u-pem.fr.
