<div class="gmail_quote">On Thu, Nov 24, 2011 at 01:49, Dmitry Karpeev <span dir="ltr"><<a href="mailto:karpeev@mcs.anl.gov">karpeev@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>I mean that for a scatter (a,x) (a,y) with MAX_VALUES the result at a would be the MAX of values at x and y.</div>

<div>With the new API that would be disallowed. </div></blockquote><div><br></div><div>Yes, but you could flip the spaces as in (x,a) (y,a).</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div> Also, if you allow (a,x) (b,x) then you are effectively allowing (x,a) (x,b),</div><div>since you can emulate it with the reverse mode, unless you ban that too.</div></blockquote></div><br><div>My point is that the ability to reduce (and gather/scatter) resides on only one side. When you create the scatter, you can choose which side has reductions. It makes the specification asymmetric. This reduces storage and makes certain operations more performant. It also (I think) eliminates some bugs and makes reduction and (more importantly) gather/scatter semantics easier to understand.</div>
<div><br></div><div>It's entirely possible to allow reduction on both sides (still with lightweight/scalable storage), but I think it would be more confusing to work with. I'm skeptical that it's important.</div>
<div><br></div><div>BTW, remote fetch-and-add is a fantastic tool for inverting communication graphs without O(size) redundant storage. So if the space with multiple edges per vertex knows who should own a point (e.g. in graph partitioning), we can flip the graph without global synchronization (like Allreduce) or O(size) storage.</div>