The request make perfect sense. I have a suggestion regarding the implementation: please add the two new functions to the exported MTL structure in each MTL (like in the attached patch for MX).
Index: ompi/mca/mtl/mx/mtl_mx.c =================================================================== --- ompi/mca/mtl/mx/mtl_mx.c (revision 24855) +++ ompi/mca/mtl/mx/mtl_mx.c (working copy) @@ -59,7 +59,9 @@ ompi_mtl_mx_irecv, ompi_mtl_mx_iprobe, - ompi_mtl_mx_cancel + ompi_mtl_mx_cancel, + NULL, + NULL, } }; Thanks, george. On Jul 1, 2011, at 16:45 , Mike Dubman wrote: > WHAT: Adding communicator add/delete callbacks to MTL. > > WHY: MTL will be able to separate messages on different contexts. > > WHEN: On trunk (later on v1.5 as well), Tuesday telconf, 5 July 2011 > > TIMEOUT: Tuesday telconf, 12 July 2011 > > DETAILS: > > Currently MTLs do no handle communicator contexts in any special way, > they only add the context id to the tag selection of the underlying > messaging meachinsm. > > We would like to enable an MTL to maintain its own context data > per-communicator. This way an MTL will be able to queue incoming eager > messages and rendezvous requests per-communicator basis. > The MTL will be allowed to override comm->c_pml_comm member, > since it's unused in pml_cm anyway. > > > diff -r 0f757f8f3efb -r 8fcf276ee527 ompi/mca/mtl/mtl.h > --- a/ompi/mca/mtl/mtl.h Thu Jun 30 14:13:33 2011 +0300 > +++ b/ompi/mca/mtl/mtl.h Fri Jul 01 13:54:20 2011 +0300 > @@ -355,6 +355,34 @@ > > > /** > + * Downcall from PML layer when a new communicator is created. > + * > + * @param comm Communicator > + * @return OMPI_SUCCESS or failure status. > + * > + * Provides the MTL the opportunity to initialize/cache a data structure > + * on the communicator. > + */ > +typedef int (*mca_mtl_base_module_add_comm_fn_t)( > + struct mca_mtl_base_module_t* mtl, > + struct ompi_communicator_t* comm); > + > + > +/** > + * Downcall from PML layer when a communicator is destroyed. > + * > + * @param comm Communicator > + * @return OMPI_SUCCESS or failure status. > + * > + * Provides the MTL the opportunity to cleanup any datastructures > + * associated with the communicator. > + */ > +typedef int (*mca_mtl_base_module_del_comm_fn_t)( > + struct mca_mtl_base_module_t* mtl, > + struct ompi_communicator_t* comm); > + > + > +/** > * MTL module interface functions and attributes. > */ > struct mca_mtl_base_module_t { > @@ -368,7 +396,6 @@ > mca_mtl_base_module_add_procs_fn_t mtl_add_procs; > mca_mtl_base_module_del_procs_fn_t mtl_del_procs; > mca_mtl_base_module_finalize_fn_t mtl_finalize; > - > mca_mtl_base_module_send_fn_t mtl_send; > mca_mtl_base_module_isend_fn_t mtl_isend; > mca_mtl_base_module_irecv_fn_t mtl_irecv; > @@ -376,6 +403,8 @@ > > /* Optional MTL functions */ > mca_mtl_base_module_cancel_fn_t mtl_cancel; > + mca_mtl_base_module_add_comm_fn_t mtl_add_comm; > + mca_mtl_base_module_del_comm_fn_t mtl_del_comm; > }; > typedef struct mca_mtl_base_module_t mca_mtl_base_module_t; > > diff -r 0f757f8f3efb -r 8fcf276ee527 ompi/mca/pml/cm/pml_cm.c > --- a/ompi/mca/pml/cm/pml_cm.c Thu Jun 30 14:13:33 2011 +0300 > +++ b/ompi/mca/pml/cm/pml_cm.c Fri Jul 01 13:54:20 2011 +0300 > @@ -82,14 +82,22 @@ > int > mca_pml_cm_add_comm(ompi_communicator_t* comm) > { > + int ret; > + > /* should never happen, but it was, so check */ > if (comm->c_contextid > ompi_pml_cm.super.pml_max_contextid) { > return OMPI_ERR_OUT_OF_RESOURCE; > } > > - /* setup our per-communicator data */ > + /* initialize per-communicator data. MTLs may override this. */ > comm->c_pml_comm = NULL; > > + /* notify the MTL about the added communicator */ > + if ((NULL != ompi_mtl->mtl_add_comm) && > + (OMPI_SUCCESS != (ret = OMPI_MTL_CALL(add_comm(ompi_mtl, comm))))) { > + return ret; > + } > + > return OMPI_SUCCESS; > } > > @@ -97,8 +105,13 @@ > int > mca_pml_cm_del_comm(ompi_communicator_t* comm) > { > - /* clean up our per-communicator data */ > - comm->c_pml_comm = NULL; > + int ret; > + > + /* notify the MTL about the deleted communicator */ > + if ((NULL != ompi_mtl->mtl_del_comm) && > + (OMPI_SUCCESS != (ret = OMPI_MTL_CALL(del_comm(ompi_mtl, comm))))) { > + return ret; > + } > > return OMPI_SUCCESS; > } > > _______________________________________________ > devel-core mailing list > devel-c...@open-mpi.org > http://www.open-mpi.org/mailman/listinfo.cgi/devel-core