#include #include #include #include #include "distribution_methods/block_distribution.h" #include "CommDist.h" void send_sync_arrays(struct Dist_data dist_data, char *array, int numP_child, struct Counts counts); void recv_sync_arrays(struct Dist_data dist_data, char *array, int numP_parents, struct Counts counts); void send_async_arrays(struct Dist_data dist_data, char *array, int numP_child, struct Counts counts, MPI_Request *comm_req); void recv_async_arrays(struct Dist_data dist_data, char *array, int numP_parents, struct Counts counts, MPI_Request *comm_req); void send_async_point_arrays(struct Dist_data dist_data, char *array, int numP_child, struct Counts counts, MPI_Request *comm_req); void recv_async_point_arrays(struct Dist_data dist_data, char *array, int numP_parents, struct Counts counts, MPI_Request *comm_req); void getIds_intercomm(struct Dist_data dist_data, int numP_other, int **idS); /* * Reserva memoria para un vector de hasta "qty" elementos. * Los "qty" elementos se disitribuyen entre los "numP" procesos * que llaman a esta funcion. */ void malloc_comm_array(char **array, int qty, int myId, int numP) { struct Dist_data dist_data; get_block_dist(qty, myId, numP, &dist_data); if( (*array = malloc( (size_t) dist_data.tamBl * sizeof(char))) == NULL) { printf("Memory Error (Malloc Arrays(%d))\n", dist_data.tamBl); exit(1); } /* int i; for(i=0; i dist_data.ini) { // First subgroup (tamOther+1) idI = dist_data.ini / (tamOther + 1); } else { // Second subgroup (tamOther) idI = ((dist_data.ini - middle) / tamOther) + remOther; } // Calcular idR teniendo en cuenta si se comunica con un // proceso con tamano tamOther o tamOther+1 if(middle >= dist_data.fin) { // First subgroup (tamOther +1) idE = dist_data.fin / (tamOther + 1); idE = (dist_data.fin % (tamOther + 1) > 0 && idE+1 <= numP_other) ? idE+1 : idE; } else { // Second subgroup (tamOther) idE = ((dist_data.fin - middle) / tamOther) + remOther; idE = ((dist_data.fin - middle) % tamOther > 0 && idE+1 <= numP_other) ? idE+1 : idE; } *idS = malloc(2 * sizeof(int)); (*idS)[0] = idI; (*idS)[1] = idE; }