/* smpi_coll.c -- various optimized routing for collectives */
-/* Copyright (c) 2009, 2010. The SimGrid Team.
+/* Copyright (c) 2009-2013. 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"
+s_mpi_coll_description_t mpi_coll_gather_description[] = {
+ {"default",
+ "gather default collective",
+ smpi_mpi_gather},
+COLL_GATHERS(COLL_DESCRIPTION, COLL_COMMA),
+ {NULL, NULL, NULL} /* this array must be NULL terminated */
+};
+
+
s_mpi_coll_description_t mpi_coll_allgather_description[] = {
{"default",
"allgather default collective",
{NULL, NULL, NULL} /* this array must be NULL terminated */
};
+s_mpi_coll_description_t mpi_coll_reduce_scatter_description[] = {
+ {"default",
+ "reduce_scatter default collective",
+ smpi_mpi_reduce_scatter},
+COLL_REDUCE_SCATTERS(COLL_DESCRIPTION, COLL_COMMA),
+ {NULL, NULL, NULL} /* this array must be NULL terminated */
+};
+
+s_mpi_coll_description_t mpi_coll_scatter_description[] = {
+ {"default",
+ "scatter default collective",
+ smpi_mpi_scatter},
+COLL_SCATTERS(COLL_DESCRIPTION, COLL_COMMA),
+ {NULL, NULL, NULL} /* this array must be NULL terminated */
+};
+
+s_mpi_coll_description_t mpi_coll_barrier_description[] = {
+ {"default",
+ "barrier default collective",
+ smpi_mpi_barrier},
+COLL_BARRIERS(COLL_DESCRIPTION, COLL_COMMA),
+ {NULL, NULL, NULL} /* this array must be NULL terminated */
+};
s_mpi_coll_description_t mpi_coll_alltoall_description[] = {
- {"ompi",
+ {"default",
"Ompi alltoall default collective",
- smpi_coll_tuned_alltoall_ompi},
+ smpi_coll_tuned_alltoall_ompi2},
COLL_ALLTOALLS(COLL_DESCRIPTION, COLL_COMMA),
{"bruck",
"Alltoall Bruck (SG) collective",
s_mpi_coll_description_t mpi_coll_bcast_description[] = {
{"default",
- "allgather default collective",
+ "bcast 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",
+ "reduce default collective",
smpi_mpi_reduce},
COLL_REDUCES(COLL_DESCRIPTION, COLL_COMMA),
{NULL, NULL, NULL} /* this array must be NULL terminated */
return i;
}
}
- name_list = strdup(table[0].name);
+ if (!table[0].name)
+ xbt_die("No collective is valid! This is a bug.");
+ 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);
int (*mpi_coll_allreduce_fun)(void *sbuf, void *rbuf, int rcount, MPI_Datatype dtype, MPI_Op op, MPI_Comm comm);
int (*mpi_coll_alltoallv_fun)(void *, int*, int*, MPI_Datatype, void*, int*, 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);
-
+int (*mpi_coll_reduce_scatter_fun)(void *sbuf, void *rbuf, int *rcounts,MPI_Datatype dtype,MPI_Op op,MPI_Comm comm);
+int (*mpi_coll_scatter_fun)(void *sendbuf, int sendcount, MPI_Datatype sendtype,void *recvbuf, int recvcount, MPI_Datatype recvtype,int root, MPI_Comm comm);
+int (*mpi_coll_barrier_fun)(MPI_Comm comm);
struct s_proc_tree {
int PROCTREE_A;
int numChildren;
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;
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;
free_tree(tree);
}
-int smpi_coll_tuned_alltoall_ompi(void *sendbuf, int sendcount,
+int smpi_coll_tuned_alltoall_ompi2(void *sendbuf, int sendcount,
MPI_Datatype sendtype, void *recvbuf,
int recvcount, MPI_Datatype recvtype,
MPI_Comm comm)