X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/29df986cd461330e1e590bd3bc9507a3d0ce2dc6..0dda9bcd2d7df2c8141a8170a7cb8fe20746b4a9:/src/smpi/smpi_topo.cpp diff --git a/src/smpi/smpi_topo.cpp b/src/smpi/smpi_topo.cpp index 4021d19103..432174ed2b 100644 --- a/src/smpi/smpi_topo.cpp +++ b/src/smpi/smpi_topo.cpp @@ -1,5 +1,4 @@ -/* Copyright (c) 2014, 2017. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2014-2017. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ @@ -9,6 +8,8 @@ #include "private.h" #include #include +#include "src/smpi/smpi_comm.hpp" +#include "src/smpi/smpi_topo.hpp" /* static functions */ static int assignnodes(int ndim, int nfactor, int *pfacts,int **pdims); @@ -18,14 +19,13 @@ static int getfactors(int num, int *nfators, int **factors); namespace simgrid{ namespace smpi{ - -Graph::~Graph() +Topo_Graph::~Topo_Graph() { delete[] index_; delete[] edges_; } -Dist_Graph::~Dist_Graph() +Topo_Dist_Graph::~Topo_Dist_Graph() { delete[] in_; delete[] in_weights_; @@ -36,17 +36,15 @@ Dist_Graph::~Dist_Graph() /******************************************************************************* * Cartesian topologies ******************************************************************************/ -Cart::~Cart() +Topo_Cart::~Topo_Cart() { delete[] dims_; delete[] periodic_; delete[] position_; } -Cart::Cart(int ndims) +Topo_Cart::Topo_Cart(int ndims) : ndims_(ndims) { - nnodes_ = 0; - ndims_ = ndims; dims_ = new int[ndims]; periodic_ = new int[ndims]; position_ = new int[ndims]; @@ -54,15 +52,14 @@ Cart::Cart(int ndims) /* reorder is ignored, don't know what would be the consequences of a dumb reordering but neither do I see the point of * reordering*/ -Cart::Cart(MPI_Comm comm_old, int ndims, int dims[], int periods[], int reorder, MPI_Comm *comm_cart) : Cart(ndims) { +Topo_Cart::Topo_Cart(MPI_Comm comm_old, int ndims, int dims[], int periods[], int reorder, MPI_Comm *comm_cart) : Topo_Cart(ndims) { MPI_Group newGroup; MPI_Group oldGroup; - int nranks; int rank = comm_old->rank(); - int newSize = 1; if(ndims != 0) { + int newSize = 1; for (int i = 0 ; i < ndims ; i++) { newSize *= dims[i]; } @@ -71,7 +68,7 @@ Cart::Cart(MPI_Comm comm_old, int ndims, int dims[], int periods[], int reorder, return; } oldGroup = comm_old->group(); - newGroup = new simgrid::smpi::Group(newSize); + newGroup = new Group(newSize); for (int i = 0 ; i < newSize ; i++) { newGroup->set_mapping(oldGroup->index(i), i); } @@ -79,7 +76,7 @@ Cart::Cart(MPI_Comm comm_old, int ndims, int dims[], int periods[], int reorder, nnodes_ = newSize; // FIXME : code duplication... See coords - nranks = newSize; + int nranks = newSize; for (int i=0; igroup()), this); + *comm_cart = new Comm(new Group(MPI_COMM_SELF->group()), this); } else { *comm_cart = MPI_COMM_NULL; } @@ -100,9 +97,8 @@ Cart::Cart(MPI_Comm comm_old, int ndims, int dims[], int periods[], int reorder, comm_=*comm_cart; } -Cart* Cart::sub(const int remain_dims[], MPI_Comm *newcomm) { +Topo_Cart* Topo_Cart::sub(const int remain_dims[], MPI_Comm *newcomm) { int oldNDims = ndims_; - int j = 0; int *newDims = nullptr; int *newPeriodic = nullptr; @@ -120,6 +116,7 @@ Cart* Cart::sub(const int remain_dims[], MPI_Comm *newcomm) { newPeriodic = xbt_new(int, newNDims); // that should not segfault + int j = 0; for (int i = 0 ; j < newNDims ; i++) { if(remain_dims[i]) { newDims[j] =dims_[i]; @@ -128,10 +125,10 @@ Cart* Cart::sub(const int remain_dims[], MPI_Comm *newcomm) { } } } - return new Cart(comm_, newNDims, newDims, newPeriodic, 0, newcomm); + return new Topo_Cart(comm_, newNDims, newDims, newPeriodic, 0, newcomm); } -int Cart::coords(int rank, int maxdims, int coords[]) { +int Topo_Cart::coords(int rank, int maxdims, int coords[]) { int nnodes = nnodes_; for (int i = 0; i< ndims_; i++ ) { nnodes = nnodes /dims_[i]; @@ -141,7 +138,7 @@ int Cart::coords(int rank, int maxdims, int coords[]) { return MPI_SUCCESS; } -int Cart::get(int maxdims, int* dims, int* periods, int* coords) { +int Topo_Cart::get(int maxdims, int* dims, int* periods, int* coords) { int ndims=ndims_ < maxdims ?ndims_ : maxdims; for(int i = 0 ; i < ndims ; i++) { dims[i] =dims_[i]; @@ -151,14 +148,13 @@ int Cart::get(int maxdims, int* dims, int* periods, int* coords) { return MPI_SUCCESS; } -int Cart::rank(int* coords, int* rank) { +int Topo_Cart::rank(int* coords, int* rank) { int ndims =ndims_; - int coord; *rank = 0; int multiplier = 1; for (int i=ndims-1; i >=0; i-- ) { - coord = coords[i]; + int coord = coords[i]; /* The user can give us whatever coordinates he wants. If one of them is out of range, either this dimension is * periodic, and we consider the equivalent coordinate inside the bounds, or it's not and then it's an error @@ -188,7 +184,7 @@ int Cart::rank(int* coords, int* rank) { return MPI_SUCCESS; } -int Cart::shift(int direction, int disp, int *rank_source, int *rank_dest) { +int Topo_Cart::shift(int direction, int disp, int *rank_source, int *rank_dest) { int position[ndims_]; @@ -229,7 +225,7 @@ int Cart::shift(int direction, int disp, int *rank_source, int *rank_dest) { return MPI_SUCCESS; } -int Cart::dim_get(int *ndims) { +int Topo_Cart::dim_get(int *ndims) { *ndims =ndims_; return MPI_SUCCESS; } @@ -243,12 +239,12 @@ int Cart::dim_get(int *ndims) { * Copyright (c) 2004-2005 The University of Tennessee and The University * of Tennessee Research Foundation. All rights * reserved. - * Copyright (c) 2004-2014 High Performance Computing Center Stuttgart, + * Copyright (c) 2004-2014 High Performance Computing Center Stuttgart, * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. * Copyright (c) 2012 Los Alamos National Security, LLC. All rights - * reserved. + * reserved. * Copyright (c) 2014 Intel, Inc. All rights reserved * $COPYRIGHT$ * @@ -257,11 +253,10 @@ int Cart::dim_get(int *ndims) { * $HEADER$ */ - /* * This is a utility function, no need to have anything in the lower layer for this at all */ -int Dims_create(int nnodes, int ndims, int dims[]) +int Topo_Cart::Dims_create(int nnodes, int ndims, int dims[]) { /* Get # of free-to-be-assigned processes and # of free dimensions */ int freeprocs = nnodes;