Jie,<div>it sounds to me that either the variable is not volatile or compiler optimization</div><div>causes some problem. I would check for these first.</div><div>Arkady<br><br><div class="gmail_quote">On Fri, May 1, 2009 at 12:35 AM, Jie Cai <span dir="ltr"><<a href="mailto:Jie.Cai@cs.anu.edu.au">Jie.Cai@cs.anu.edu.au</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Thanks for the help along my understanding with IB and uDAPL.<br>
<br>
Is that possible to spin remote memory of a rdma atomic compare and swap (dat_ib_post_cmp_and_swap())?<br>
<br>
I have wrote a program that initiator atomic cmp_swap a value to a remote memory.<br>
<br>
Instead of sending a message to notify the remoter about the completion of cmp_swap,<br>
the remoter actually doing a memory spin to test the update on the memory (e.g. while(target == 0);).<br>
<br>
However, at remote side, this while loops goes infinitely, and the initiator has already received DAT_IB_DTO_EVENT.<br>
<br>
I don't really understand what's going on, and what would be a correct way to spin memory for checking remote<br>
write updates.<br>
<br>
Any suggestions?<br>
<br>
Regards,<br>
Jie<br>
<br>
-- <br><font color="#888888">
Jie Cai</font><div><div></div><div class="h5"><br>
<br>
<br>
<br>
Caitlin Bestler wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
On Tue, Mar 31, 2009 at 11:41 PM, Jie Cai <<a href="mailto:Jie.Cai@cs.anu.edu.au" target="_blank">Jie.Cai@cs.anu.edu.au</a>> wrote:<br>
  <br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Understood now. A further question is here again.<br>
<br>
To implement software level acknowledgment to inform initiator that data<br>
has been available for remoter, is that possible to use a busy loop at<br>
remote<br>
side to detect the last element of transferring has appear in the memory.<br>
<br>
Or remoter has to wait for the event of recv matching initiator's send, then<br>
send a message back to initiator as a acknowledgment?<br>
<br>
    <br>
</blockquote>
<br>
There are two issues when spinning on a remote memory update.<br>
<br>
The first is that packets may be received and processed out of order,<br>
especially for iWARP. Therefore the fact that the last byte has been<br>
received and placed does not guarantee that the prior packets have<br>
been received and placed.<br>
<br>
More importantly, the order in which updates become visible to a<br>
specific software thread can make the order of updates unpredictable<br>
to the application.<br>
<br>
When delivering a completion the Provider is responsible for dealing<br>
with both of these problems. So when you reap a completion from the<br>
CQ, the operation it represents (and all prior operations) are complete.<br>
There are no gaps in received packets, nothing is still sitting on an<br>
Adapter buffer waiting to be placed in host memory.<br>
<br>
If your application does not want to block you can consider polling<br>
the cq whether than enabling notifications. But polling memory locations<br>
directly should only be done when you're willing to have bus/adapter<br>
specific dependencies. You working code might stop working when<br>
your network changes, or you install a new Adapter that has a different<br>
strategy for optimizing its writes over the PCIe bus.<br>
  <br>
</blockquote>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>Cheers,<br>Arkady Kanevsky<br>
</div>