/* smpi_coll.c -- various optimized routing for collectives */
-/* Copyright (c) 2009-2013. 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
#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",
}
int find_coll_description(s_mpi_coll_description_t * table,
- char *name)
+ char *name, const char *desc)
{
int i;
char *name_list = NULL;
}
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;
}
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,
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);
}
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);
}
}
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);
}
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,
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;
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,
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;
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,
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;