next step: a first version of how a non-segmented hierarchical bcast might look like with the current data structures
This commit was SVN r4531.
Этот коммит содержится в:
родитель
140f937880
Коммит
dbedfcda69
@ -201,6 +201,7 @@ mca_coll_hierarch_module_init(struct ompi_communicator_t *comm)
|
|||||||
if ( NULL == data->hier_reqs ) {
|
if ( NULL == data->hier_reqs ) {
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
data->hier_am_lleader=0; /* false */
|
||||||
|
|
||||||
/* determine how many local leader there are and who they are */
|
/* determine how many local leader there are and who they are */
|
||||||
colorarr = (int *) comm->c_coll_selected_data;
|
colorarr = (int *) comm->c_coll_selected_data;
|
||||||
@ -228,8 +229,10 @@ mca_coll_hierarch_module_init(struct ompi_communicator_t *comm)
|
|||||||
data->hier_my_lleader = c;
|
data->hier_my_lleader = c;
|
||||||
}
|
}
|
||||||
c++;
|
c++;
|
||||||
|
if ( llr[c] == rank ) {
|
||||||
|
data->hier_am_lleader = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
data->hier_num_lleaders = c-1;
|
data->hier_num_lleaders = c-1;
|
||||||
@ -365,9 +368,6 @@ mca_coll_hierarch_checkfor_component ( struct ompi_communicator_t *comm,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Here we might introduce later on an allreduce step to determine,
|
|
||||||
whether we agree on the result or not */
|
|
||||||
|
|
||||||
*ncount = counter; /* true */
|
*ncount = counter; /* true */
|
||||||
/* Print the final result */
|
/* Print the final result */
|
||||||
if ( counter == 1 ) {
|
if ( counter == 1 ) {
|
||||||
|
@ -44,6 +44,7 @@ extern int mca_coll_hierarch_verbose;
|
|||||||
int hier_num_lleaders; /* number of local leaders */
|
int hier_num_lleaders; /* number of local leaders */
|
||||||
int *hier_lleaders; /* list of local leaders */
|
int *hier_lleaders; /* list of local leaders */
|
||||||
int hier_my_lleader; /* pos. of my lleader in hier_lleaders */
|
int hier_my_lleader; /* pos. of my lleader in hier_lleaders */
|
||||||
|
int hier_am_lleader; /* am I an lleader? */
|
||||||
int hier_num_reqs; /* num. of requests */
|
int hier_num_reqs; /* num. of requests */
|
||||||
ompi_request_t **hier_reqs; /* list of requests */
|
ompi_request_t **hier_reqs; /* list of requests */
|
||||||
};
|
};
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include "util/output.h"
|
#include "util/output.h"
|
||||||
#include "mca/coll/coll.h"
|
#include "mca/coll/coll.h"
|
||||||
#include "mca/coll/base/base.h"
|
#include "mca/coll/base/base.h"
|
||||||
|
#include "mca/coll/base/coll_tags.h"
|
||||||
#include "coll_hierarch.h"
|
#include "coll_hierarch.h"
|
||||||
|
|
||||||
|
|
||||||
@ -31,10 +32,52 @@
|
|||||||
* Returns: - MPI_SUCCESS or error code
|
* Returns: - MPI_SUCCESS or error code
|
||||||
*/
|
*/
|
||||||
int mca_coll_hierarch_bcast_intra(void *buff, int count,
|
int mca_coll_hierarch_bcast_intra(void *buff, int count,
|
||||||
struct ompi_datatype_t *datatype, int root,
|
struct ompi_datatype_t *datatype, int root,
|
||||||
struct ompi_communicator_t *comm)
|
struct ompi_communicator_t *comm)
|
||||||
{
|
{
|
||||||
ompi_output_verbose(10, mca_coll_base_output, "In hierarch bcast_intra");
|
struct mca_coll_base_comm_t *data=NULL;
|
||||||
return comm->c_coll_basic_module->coll_bcast(buff, count, datatype,
|
struct ompi_communicator_t *llcomm=NULL;
|
||||||
root, comm);
|
int i, rank, ret;
|
||||||
}
|
|
||||||
|
rank = ompi_comm_rank ( comm );
|
||||||
|
data = comm->c_coll_selected_data;
|
||||||
|
llcomm = data->hier_llcomm;
|
||||||
|
|
||||||
|
/* trivial linear distribution of the data to all local leaders.
|
||||||
|
need something significantly better */
|
||||||
|
if ( rank == root ) {
|
||||||
|
for (i=0; i< data->hier_num_lleaders; i++) {
|
||||||
|
if ( data->hier_lleaders[i] == data->hier_my_lleader ) {
|
||||||
|
data->hier_reqs[i] = MPI_REQUEST_NULL;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
ret = mca_pml.pml_isend (buff, count, datatype, data->hier_lleaders[i],
|
||||||
|
MCA_COLL_BASE_TAG_BCAST,
|
||||||
|
MCA_PML_BASE_SEND_STANDARD,
|
||||||
|
comm, &(data->hier_reqs[i]));
|
||||||
|
if ( OMPI_SUCCESS != ret ) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ret = ompi_request_wait_all ( data->hier_num_lleaders, data->hier_reqs,
|
||||||
|
MPI_STATUSES_IGNORE);
|
||||||
|
if ( OMPI_SUCCESS != ret ) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ( data->hier_am_lleader ) {
|
||||||
|
ret = mca_pml.pml_recv ( buff, count, datatype, root,
|
||||||
|
MCA_COLL_BASE_TAG_BCAST, comm,
|
||||||
|
MPI_STATUS_IGNORE );
|
||||||
|
if ( OMPI_SUCCESS != ret ) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( MPI_COMM_NULL != llcomm ) {
|
||||||
|
ret = llcomm->c_coll.coll_bcast(buff, count, datatype,
|
||||||
|
data->hier_my_lleader, llcomm );
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user