X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/25cc8f2c515534fee077ff6ef9a71b55bfc2786f..b3b356352e87ae00a20f737c48e19b0c8413455a:/src/smpi/smpi_coll.c diff --git a/src/smpi/smpi_coll.c b/src/smpi/smpi_coll.c index 172ddb167c..c452e2a808 100644 --- a/src/smpi/smpi_coll.c +++ b/src/smpi/smpi_coll.c @@ -1,6 +1,6 @@ /* smpi_coll.c -- various optimized routing for collectives */ -/* Copyright (c) 2009, 2010. The SimGrid Team. +/* Copyright (c) 2009-2015. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -14,6 +14,9 @@ #include "colls/colls.h" #include "simgrid/sg_config.h" +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_coll, smpi, + "Logging specific to SMPI (coll)"); + s_mpi_coll_description_t mpi_coll_gather_description[] = { {"default", "gather default collective", @@ -121,7 +124,7 @@ void coll_help(const char *category, s_mpi_coll_description_t * table) } int find_coll_description(s_mpi_coll_description_t * table, - char *name) + char *name, const char *desc) { int i; char *name_list = NULL; @@ -132,6 +135,8 @@ int find_coll_description(s_mpi_coll_description_t * table, } for (i = 0; table[i].name; i++) if (!strcmp(name, table[i].name)) { + if (strcmp(table[i].name,"default")) + XBT_INFO("Switch to algorithm %s for collective %s",table[i].name,desc); return i; } @@ -143,7 +148,9 @@ int find_coll_description(s_mpi_coll_description_t * table, return i; } } - name_list = strdup(table[0].name); + if (!table[0].name) + xbt_die("No collective is valid for '%s'! This is a bug.",name); + name_list = xbt_strdup(table[0].name); for (i = 1; table[i].name; i++) { name_list = xbt_realloc(name_list, @@ -151,13 +158,10 @@ int find_coll_description(s_mpi_coll_description_t * table, strcat(name_list, ", "); strcat(name_list, table[i].name); } - xbt_die("Model '%s' is invalid! Valid models are: %s.", name, name_list); + xbt_die("Collective '%s' is invalid! Valid collectives are: %s.", name, name_list); return -1; } -XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_coll, smpi, - "Logging specific to SMPI (coll)"); - int (*mpi_coll_gather_fun)(void *, int, MPI_Datatype, void*, int, MPI_Datatype, int root, MPI_Comm); int (*mpi_coll_allgather_fun)(void *, int, MPI_Datatype, void*, int, MPI_Datatype, MPI_Comm); int (*mpi_coll_allgatherv_fun)(void *, int, MPI_Datatype, void*, int*, int*, MPI_Datatype, MPI_Comm); @@ -243,7 +247,7 @@ static void build_tree(int root, int rank, int size, proc_tree_t * tree) static void tree_bcast(void *buf, int count, MPI_Datatype datatype, MPI_Comm comm, proc_tree_t tree) { - int system_tag = 999; // used negative int but smpi_create_request() declares this illegal (to be checked) + int system_tag = COLL_TAG_BCAST; int rank, i; MPI_Request *requests; @@ -272,6 +276,9 @@ static void tree_bcast(void *buf, int count, MPI_Datatype datatype, } smpi_mpi_startall(tree->numChildren, requests); smpi_mpi_waitall(tree->numChildren, requests, MPI_STATUS_IGNORE); + for(i = 0; i < tree->numChildren; i++) { + if(requests[i]!=MPI_REQUEST_NULL) smpi_mpi_request_free(&requests[i]); + } xbt_free(requests); } @@ -281,7 +288,7 @@ static void tree_bcast(void *buf, int count, MPI_Datatype datatype, static void tree_antibcast(void *buf, int count, MPI_Datatype datatype, MPI_Comm comm, proc_tree_t tree) { - int system_tag = 999; // used negative int but smpi_create_request() declares this illegal (to be checked) + int system_tag = COLL_TAG_BCAST; int rank, i; MPI_Request *requests; @@ -310,6 +317,9 @@ static void tree_antibcast(void *buf, int count, MPI_Datatype datatype, } smpi_mpi_startall(tree->numChildren, requests); smpi_mpi_waitall(tree->numChildren, requests, MPI_STATUS_IGNORE); + for(i = 0; i < tree->numChildren; i++) { + if(requests[i]!=MPI_REQUEST_NULL) smpi_mpi_request_free(&requests[i]); + } xbt_free(requests); } @@ -395,8 +405,8 @@ int smpi_coll_tuned_alltoall_bruck(void *sendbuf, int sendcount, rank = smpi_comm_rank(comm); size = smpi_comm_size(comm); XBT_DEBUG("<%d> algorithm alltoall_bruck() called.", rank); - err = smpi_datatype_extent(sendtype, &lb, &sendext); - err = smpi_datatype_extent(recvtype, &lb, &recvext); + smpi_datatype_extent(sendtype, &lb, &sendext); + smpi_datatype_extent(recvtype, &lb, &recvext); /* Local copy from self */ err = smpi_datatype_copy((char *)sendbuf + rank * sendcount * sendext, @@ -435,6 +445,9 @@ int smpi_coll_tuned_alltoall_bruck(void *sendbuf, int sendcount, smpi_mpi_startall(count, requests); XBT_DEBUG("<%d> wait for %d requests", rank, count); smpi_mpi_waitall(count, requests, MPI_STATUS_IGNORE); + for(i = 0; i < count; i++) { + if(requests[i]!=MPI_REQUEST_NULL) smpi_mpi_request_free(&requests[i]); + } xbt_free(requests); } return MPI_SUCCESS; @@ -458,8 +471,8 @@ int smpi_coll_tuned_alltoall_basic_linear(void *sendbuf, int sendcount, rank = smpi_comm_rank(comm); size = smpi_comm_size(comm); XBT_DEBUG("<%d> algorithm alltoall_basic_linear() called.", rank); - err = smpi_datatype_extent(sendtype, &lb, &sendext); - err = smpi_datatype_extent(recvtype, &lb, &recvext); + smpi_datatype_extent(sendtype, &lb, &sendext); + smpi_datatype_extent(recvtype, &lb, &recvext); /* simple optimization */ err = smpi_datatype_copy((char *)sendbuf + rank * sendcount * sendext, sendcount, sendtype, @@ -491,6 +504,9 @@ int smpi_coll_tuned_alltoall_basic_linear(void *sendbuf, int sendcount, smpi_mpi_startall(count, requests); XBT_DEBUG("<%d> wait for %d requests", rank, count); smpi_mpi_waitall(count, requests, MPI_STATUS_IGNORE); + for(i = 0; i < count; i++) { + if(requests[i]!=MPI_REQUEST_NULL) smpi_mpi_request_free(&requests[i]); + } xbt_free(requests); } return err; @@ -511,8 +527,8 @@ int smpi_coll_basic_alltoallv(void *sendbuf, int *sendcounts, rank = smpi_comm_rank(comm); size = smpi_comm_size(comm); XBT_DEBUG("<%d> algorithm basic_alltoallv() called.", rank); - err = smpi_datatype_extent(sendtype, &lb, &sendext); - err = smpi_datatype_extent(recvtype, &lb, &recvext); + smpi_datatype_extent(sendtype, &lb, &sendext); + smpi_datatype_extent(recvtype, &lb, &recvext); /* Local copy from self */ err = smpi_datatype_copy((char *)sendbuf + senddisps[rank] * sendext, @@ -553,6 +569,9 @@ int smpi_coll_basic_alltoallv(void *sendbuf, int *sendcounts, smpi_mpi_startall(count, requests); XBT_DEBUG("<%d> wait for %d requests", rank, count); smpi_mpi_waitall(count, requests, MPI_STATUS_IGNORE); + for(i = 0; i < count; i++) { + if(requests[i]!=MPI_REQUEST_NULL) smpi_mpi_request_free(&requests[i]); + } xbt_free(requests); } return err;