#include <assert.h>
#include "private.h"
+#include "colls/colls.h"
+
+s_mpi_coll_description_t mpi_coll_allgather_description[] = {
+ {"default",
+ "allgather default collective",
+ smpi_mpi_allgather},
+COLL_ALLGATHERS(COLL_DESCRIPTION, COLL_COMMA),
+ {NULL, NULL, NULL} /* this array must be NULL terminated */
+};
+
+s_mpi_coll_description_t mpi_coll_allreduce_description[] = {
+ {"default",
+ "allreduce default collective",
+ smpi_mpi_allreduce},
+COLL_ALLREDUCES(COLL_DESCRIPTION, COLL_COMMA),
+ {NULL, NULL, NULL} /* this array must be NULL terminated */
+};
+
+s_mpi_coll_description_t mpi_coll_alltoall_description[] = {
+ {"ompi",
+ "Ompi alltoall default collective",
+ smpi_coll_tuned_alltoall_ompi},
+COLL_ALLTOALLS(COLL_DESCRIPTION, COLL_COMMA),
+ {"bruck",
+ "Alltoall Bruck (SG) collective",
+ smpi_coll_tuned_alltoall_bruck},
+ {"basic_linear",
+ "Alltoall basic linear (SG) collective",
+ smpi_coll_tuned_alltoall_basic_linear},
+ {"pairwise",
+ "Alltoall pairwise (SG) collective",
+ smpi_coll_tuned_alltoall_pairwise},
+ {NULL, NULL, NULL} /* this array must be NULL terminated */
+};
+
+s_mpi_coll_description_t mpi_coll_bcast_description[] = {
+ {"default",
+ "allgather default collective",
+ smpi_mpi_bcast},
+COLL_BCASTS(COLL_DESCRIPTION, COLL_COMMA),
+ {NULL, NULL, NULL} /* this array must be NULL terminated */
+};
+
+s_mpi_coll_description_t mpi_coll_reduce_description[] = {
+ {"default",
+ "allgather default collective",
+ smpi_mpi_reduce},
+COLL_REDUCES(COLL_DESCRIPTION, COLL_COMMA),
+ {NULL, NULL, NULL} /* this array must be NULL terminated */
+};
+
+
+
+/** Displays the long description of all registered models, and quit */
+void coll_help(const char *category, s_mpi_coll_description_t * table)
+{
+ int i;
+ printf("Long description of the %s models accepted by this simulator:\n",
+ category);
+ for (i = 0; table[i].name; i++)
+ printf(" %s: %s\n", table[i].name, table[i].description);
+}
+
+int find_coll_description(s_mpi_coll_description_t * table,
+ const char *name)
+{
+ int i;
+ char *name_list = NULL;
+
+ for (i = 0; table[i].name; i++)
+ if (!strcmp(name, table[i].name)) {
+ return i;
+ }
+ name_list = strdup(table[0].name);
+ for (i = 1; table[i].name; i++) {
+ name_list =
+ xbt_realloc(name_list,
+ strlen(name_list) + strlen(table[i].name) + 3);
+ strcat(name_list, ", ");
+ strcat(name_list, table[i].name);
+ }
+ xbt_die("Model '%s' is invalid! Valid models are: %s.", name, name_list);
+ return -1;
+}
+
+
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_coll, smpi,
"Logging specific to SMPI (coll)");
+int (*mpi_coll_allgather_fun)(void *, int, MPI_Datatype, void*, int, MPI_Datatype, MPI_Comm);
+int (*mpi_coll_allreduce_fun)(void *sbuf, void *rbuf, int rcount, MPI_Datatype dtype, MPI_Op op, MPI_Comm comm);
+int (*mpi_coll_alltoall_fun)(void *, int, MPI_Datatype, void*, int, MPI_Datatype, MPI_Comm);
+int (*mpi_coll_bcast_fun)(void *buf, int count, MPI_Datatype datatype, int root, MPI_Comm com);
+int (*mpi_coll_reduce_fun)(void *buf, void *rbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm);
+
struct s_proc_tree {
int PROCTREE_A;
int numChildren;
}
smpi_mpi_startall(tree->numChildren, requests);
smpi_mpi_waitall(tree->numChildren, requests, MPI_STATUS_IGNORE);
- for (i = 0; i < tree->numChildren; i++){
- xbt_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++){
- xbt_free (requests[i]);
- }
xbt_free(requests);
}
free_tree(tree);
}
+int smpi_coll_tuned_alltoall_ompi(void *sendbuf, int sendcount,
+ MPI_Datatype sendtype, void *recvbuf,
+ int recvcount, MPI_Datatype recvtype,
+ MPI_Comm comm)
+{
+ int size, sendsize;
+ size = smpi_comm_size(comm);
+ sendsize = smpi_datatype_size(sendtype) * sendcount;
+ if (sendsize < 200 && size > 12) {
+ return
+ smpi_coll_tuned_alltoall_bruck(sendbuf, sendcount, sendtype,
+ recvbuf, recvcount, recvtype,
+ comm);
+ } else if (sendsize < 3000) {
+ return
+ smpi_coll_tuned_alltoall_basic_linear(sendbuf, sendcount,
+ sendtype, recvbuf,
+ recvcount, recvtype, comm);
+ } else {
+ return
+ smpi_coll_tuned_alltoall_pairwise(sendbuf, sendcount, sendtype,
+ recvbuf, recvcount, recvtype,
+ comm);
+ }
+}
+
/**
* Alltoall Bruck
*
}
/**
- * Alltoall basic_linear
+ * Alltoall basic_linear (STARMPI:alltoall-simple)
**/
int smpi_coll_tuned_alltoall_basic_linear(void *sendbuf, int sendcount,
MPI_Datatype sendtype,