Boost logo

Boost :

Subject: Re: [boost] [lockfree::fifo] Review
From: Chris M. Thomasson (cristom_at_[hidden])
Date: 2009-12-20 10:57:29


"Tim Blechmann" <tim_at_[hidden]> wrote in message
news:4B2E4492.3050201_at_klingt.org...

> > Well, IMO, it should perform better because the producer and consumer
> > are
> > not thrashing each other wrt the head and tail indexes.

> the performance difference is almost the same.

Interesting. Thanks for profiling it. Have you tried aligning everything on
cache line boundaries? I would try to ensure that the buffer is aligned and
padded along with the head and tail variables. For 64-byte cache line and
32-bit pointers you could do:

struct ringbuffer
{
    void* m_buffer[1024]; // multiple of a cache-line
    uint32_t m_head;
    char pad[60];
    uint32_t m_tail;
    char pad[60];
};

Then ensure that `ringbuffer' structs are actually aligned on a cache line
boundary.

unsigned char buffer[sizeof(struct ringbuffer) + 63];

struct ringbuffer* rb = ALIGN(buffer, 64);

Now I know for sure that `rb' is isolated and won't experience/cause false
sharing with other parts of the application.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk