On Feb 23, 2009, at 12:14 , Eugene Loh wrote:

I'm a newbie and George is a veteran. So, this feels rather like David and Goliath. (Hmm, David won and became king. Gee, I kinda like that.) Anyhow...

That's an old story, we're living in modern times now ;)


George Bosilca wrote:

It doesn't sound reasonable to me. There is a reason for this, and I think it's a good reason. The sendi function work for some devices as a fast path for sending data, when the network is not flooded. However, in the case sendi cannot do the job we expect, the fact that it return the descriptor save us a call (we don't have to do the alloc call later).

This does not make any sense to me. In what sense are we "saving a call"? Not in the sense of run-time performance since the BTL is now having to allocate a descriptor it did not otherwise need. The amount of work is the same (one descriptor allocation either way), but you're just pushing that work into the BTLs.

The descriptor is a BTL resource. If the sendi doesn't return one, the PML will have to call the BTL alloc function from the BTL again (in this case the calls will look like this: btl_sendi followed by btl_alloc followed by btl_send). I'm not looking only at SM, I want all of the BTL to have the opportunity to get good performance.

If sendi return a descriptor when it fails to send the data the call list will be shorter: btl_sendi followed by btl_send. I'm trying to decrease the number of jumps between the layers (PML/BTL), not the number of lines of code in the BTL.

We are certainly not "saving a call" in the sense of reducing source code. The PML has to have code to allocate a descriptor anyway since there may not even be any sendi functions. So, the code to allocate the descriptor is already in the PML. By asking sendi functions to do the same, you're replicating that code in every sendi function... possibly multiple times per BTL since a sendi function might have multiple "out of resource" return paths.

Therefore, in the PML we already have the descriptor and we can hand it back to the BTL, which give a chance for asynchronous progress later on. Without this descriptor, the only option the PML have is to put the PML request in a queue, and to try to send it later, which is very expensive.

This also makes no sense to me. We're not talking about doing without the descriptor. The PML is prepared to allocate it anyhow. The issue is where the descriptor is allocated in the case that sendi functions exist but cannot succeed. One alternative is to use a single allocation point in the PML. The other alternative (what we have today) is to replicate that code out to multiple sites, adding unnecessary source code and interface arguments.

As I said previously, this save one jump from the PML to the BTL by adding one more return argument to the sendi function and some lines of code in every BTL. Not a big deal as a correctly written BTL can do it pretty smartly (as an example special return case where everybody jumps when an error is detected).

  george.

The PML code is in
https://svn.open-mpi.org/source/xref/ompi_1.3/ompi/mca/pml/ob1/pml_ob1_sendreq.c #mca_pml_ob1_send_request_start_copy

Existing BTL sendi functions are at
https://svn.open-mpi.org/source/xref/ompi_1.3/ompi/mca/btl/sm/ btl_sm.c#mca_btl_sm_sendi https://svn.open-mpi.org/source/xref/ompi_1.3/ompi/mca/btl/mx/ btl_mx.c#mca_btl_mx_sendi https://svn.open-mpi.org/source/xref/ompi_1.3/ompi/mca/btl/portals/btl_portals_send.c #mca_btl_portals_sendi
_______________________________________________
devel mailing list
de...@open-mpi.org
http://www.open-mpi.org/mailman/listinfo.cgi/devel

Reply via email to