I understand that any solution requires serialization: atomic reads by the spinning loop would serialize on that read,<div>while pthread_cond_wait requires mutex serialization.  sigwait serializes since it clears the signal atomically.</div>

<div>Ultimately, all three rely on atomicity of some sort, but mutexes apparently have higher overhead for it?</div><div>At least the stackoverflow page that suggests the sigwait solution reports a 40x improvement over the pthread_cond_wait </div>

<div>solution (admittedly, I don't know the details of the sigwait stuff).</div><div><br></div><div>Dmitry.<br><div><br><div class="gmail_quote">On Tue, Nov 29, 2011 at 12:40 PM, Barry Smith <span dir="ltr"><<a href="mailto:bsmith@mcs.anl.gov">bsmith@mcs.anl.gov</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div class="im"><br>
On Nov 29, 2011, at 10:41 AM, Jed Brown wrote:<br>
<br>
> On Tue, Nov 29, 2011 at 10:35, Barry Smith <<a href="mailto:bsmith@mcs.anl.gov">bsmith@mcs.anl.gov</a>> wrote:<br>
> Synchronization between threads frequently involves the use of spin-wait loops. These loops should make use of the PAUSE instruction to maximize performance and minimize power consumption. The PAUSE instruction can be added to application code now, as it is ignored on all known existing Intel architectures.<br>


><br>
> Where are going getting this from?<br>
<br>
</div>  The very first google hit for "pause instruction spin loop"; looks like they have the same web maintenance issues PETSc has :-)<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
><br>
><br>
> So for Q all I need do is<br>
><br>
> #define PAUSE<br>
><br>
> and then use PAUSE in the spin-wait to get similar performance to the Intel?<br>
><br>
> <a href="http://software.intel.com/sites/products/documentation/hpc/compilerpro/en-us/cpp/lin/compiler_c/intref_cls/common/intref_sse2_pause.htm" target="_blank">http://software.intel.com/sites/products/documentation/hpc/compilerpro/en-us/cpp/lin/compiler_c/intref_cls/common/intref_sse2_pause.htm</a><br>


><br>
> <a href="http://software.intel.com/en-us/articles/introduction-to-hyper-threading-technology/" target="_blank">http://software.intel.com/en-us/articles/introduction-to-hyper-threading-technology/</a><br>
><br>
> Use the PAUSE Instruction to Optimize Code<br>
> Intel recommends that software developers always use the PAUSE instruction in spin-wait loops.<br>
><br>
> Starting with the Intel® Pentium® 4 processor, this recommendation was made for the benefit of power savings. Executing a PAUSE in a spin-wait loop forces the spin-wait to finish one iteration of the loop before starting the next iteration. Halting the spin-wait loop reduces consumption of non-productive resources - and thus power.<br>


><br>
> With a Hyper-Threading Technology supported processor, using the PAUSE instruction optimizes processing of two threads. Pausing the spin-wait loop frees more resources for the other processor, allowing faster completion of its thread.<br>


><br>
> Use OS Synchronization Techniques on Long Waits<br>
> When a thread suspects a thread will take longer than an OS quantum of time before a lock is released, use OS synchronization techniques to idle the processor until the lock is released. Idling the Hyper-Threading Technology supported processor frees the locked processor to use all resources available to complete its execution. Use OS primitives to release the lock when thread execution has completed.<br>


><br>
> If a thread suspects a thread will release a lock within an OS quantum, use a spin-wait.<br>
<br>
</div></div></blockquote></div><br></div></div>