GC, the simple solution

Daniel Keep daniel.keep.lists at gmail.com
Wed Jun 14 03:45:21 PDT 2006



Sean Kelly wrote:
> Bruno Medeiros wrote:
>>
>> Ah, I see. I had recently read about relative out-of-order execution
>> problems in the Memory Barrier wikipedia entry, and I got the
>> impression (out of nowhere) that the hardware took care of that
>> transparently (i.e., without program intervention), but then, that is
>> not the case, not allways at least?
> 
> A single CPU is allowed to do whatever it wants so long as it can fool
> the user into thinking it's executing instructions in a purely
> sequential manner.  However, the only information other CPUs in the
> system have is what they observe on the system bus.  Obviously, so long
> as CPUs aren't sharing data there aren't any problems.  But things get
> sticky when this isn't the case.  The memory model defines observable
> behavior allowed for a given architecture, as well as any methods
> offered for affecting that behavior.
> 
> Say a specific architecture can operate much more quickly if it is
> allowed to perform writes to memory (from cache) in order of ascending
> address rather than in the order they were issued in code.  There's no
> way to lie to other CPUs about the order in which writes occur and still
> have the optimization have any effect, so the designers state in the
> memory model spec that this architecture is allowed to reorder writes
> and then typically provide some means for overriding this behavior
> should it prove necessary.
> 
> Now let's suppose you have two threads doing something like this:
> 
>   thread/CPU 1:
> 
>     A = 1;
>     B = 2;
> 
>   thread/CPU 2:
> 
>     if( A == 1 )
>     {
>       assert( B == 2 );
>     }
> 
> Given the order in which a and b were declared, and therefore the order
> in which the writes occur, this assert may or may not fail.
> 
> Enter memory barriers.  Memory barriers are simply a way for the
> programmer to tell the CPU "I don't care if your way is faster, A simply
> must be written to memory before B or thread 2 will explode."  So the
> CPU behind thread 1 does as it's told at great expense to performance
> and thread 2 doesn't melt down.
> 
> The sticky part is that hardware designers don't agree with one another
> on how things should work and they never take the advice of the software
> people, so all architectures have different sets of observable behavior
> and different methods for working around it when necessary.  However,
> the common concept is that memory barriers all constrain the order in
> which memory accesses may occur with respect to each other.  Think of it
> as an assertion that "X may not occur before Y" or "X may not occur
> after Y" at the instruction level.
> 
> The x86 is actually a bit weird in this regard as it has no formal
> memory barriers for normal operations (though it has the FENCE
> instructions for SSE use).  I think this is largely for historical
> reasons--x86 PCs couldn't do SMP at all until fairly recently so none of
> this mattered, and the memory model has always been fairly strict (it
> was actually sequential until not terribly long ago).  Also, the LOCK
> instruction acts as a heavy-handed sort of memory barrier as well, so
> there has been little motivation to add new instructions for
> finer-grained control.
> 
> 
> Sean

Cool; learn something new every day.  Thanks for the informative post.

	-- Daniel

-- 
Unlike Knuth, I have neither proven or tried the above; it may not even
make sense.

v2sw5+8Yhw5ln4+5pr6OFPma8u6+7Lw4Tm6+7l6+7D
i28a2Xs3MSr2e4/6+7t4TNSMb6HTOp5en5g6RAHCP  http://hackerkey.com/



More information about the Digitalmars-d mailing list