2013-07-25 19:19:41 +00:00
|
|
|
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
|
2004-01-20 06:12:28 +00:00
|
|
|
/*
|
2007-03-16 23:11:45 +00:00
|
|
|
* Copyright (c) 2004-2007 The Trustees of Indiana University and Indiana
|
2005-11-05 19:57:48 +00:00
|
|
|
* University Research and Technology
|
|
|
|
* Corporation. All rights reserved.
|
2012-05-24 13:41:51 +00:00
|
|
|
* Copyright (c) 2004-2012 The University of Tennessee and The University
|
2005-11-05 19:57:48 +00:00
|
|
|
* of Tennessee Research Foundation. All rights
|
|
|
|
* reserved.
|
2015-06-23 20:59:57 -07:00
|
|
|
* Copyright (c) 2004-2008 High Performance Computing Center Stuttgart,
|
2004-11-28 20:09:25 +00:00
|
|
|
* University of Stuttgart. All rights reserved.
|
2005-03-24 12:43:37 +00:00
|
|
|
* Copyright (c) 2004-2005 The Regents of the University of California.
|
|
|
|
* All rights reserved.
|
2009-01-11 02:30:00 +00:00
|
|
|
* Copyright (c) 2007 Cisco Systems, Inc. All rights reserved.
|
2013-07-25 19:19:41 +00:00
|
|
|
* Copyright (c) 2013 Los Alamos National Security, LLC. All rights
|
|
|
|
* reserved.
|
2015-08-28 16:43:13 +09:00
|
|
|
* Copyright (c) 2014-2015 Research Organization for Information Science
|
2014-05-19 07:46:07 +00:00
|
|
|
* and Technology (RIST). All rights reserved.
|
2015-12-30 00:12:19 +06:00
|
|
|
* Copyright (c) 2015 Mellanox Technologies. All rights reserved.
|
|
|
|
*
|
2004-11-22 01:38:40 +00:00
|
|
|
* $COPYRIGHT$
|
2015-06-23 20:59:57 -07:00
|
|
|
*
|
2004-11-22 01:38:40 +00:00
|
|
|
* Additional copyrights may follow
|
2015-06-23 20:59:57 -07:00
|
|
|
*
|
2004-01-20 06:12:28 +00:00
|
|
|
* $HEADER$
|
|
|
|
*/
|
|
|
|
|
2004-06-07 15:33:53 +00:00
|
|
|
#include "ompi_config.h"
|
2004-01-20 06:12:28 +00:00
|
|
|
#include <stdio.h>
|
|
|
|
|
2006-02-12 01:33:29 +00:00
|
|
|
#include "ompi/mpi/c/bindings.h"
|
2009-04-29 01:32:14 +00:00
|
|
|
#include "ompi/runtime/params.h"
|
|
|
|
#include "ompi/communicator/communicator.h"
|
|
|
|
#include "ompi/errhandler/errhandler.h"
|
- Split the datatype engine into two parts: an MPI specific part in
OMPI
and a language agnostic part in OPAL. The convertor is completely
moved into OPAL. This offers several benefits as described in RFC
http://www.open-mpi.org/community/lists/devel/2009/07/6387.php
namely:
- Fewer basic types (int* and float* types, boolean and wchar
- Fixing naming scheme to ompi-nomenclature.
- Usability outside of the ompi-layer.
- Due to the fixed nature of simple opal types, their information is
completely
known at compile time and therefore constified
- With fewer datatypes (22), the actual sizes of bit-field types may be
reduced
from 64 to 32 bits, allowing reorganizing the opal_datatype
structure, eliminating holes and keeping data required in convertor
(upon send/recv) in one cacheline...
This has implications to the convertor-datastructure and other parts
of the code.
- Several performance tests have been run, the netpipe latency does not
change with
this patch on Linux/x86-64 on the smoky cluster.
- Extensive tests have been done to verify correctness (no new
regressions) using:
1. mpi_test_suite on linux/x86-64 using clean ompi-trunk and
ompi-ddt:
a. running both trunk and ompi-ddt resulted in no differences
(except for MPI_SHORT_INT and MPI_TYPE_MIX_LB_UB do now run
correctly).
b. with --enable-memchecker and running under valgrind (one buglet
when run with static found in test-suite, commited)
2. ibm testsuite on linux/x86-64 using clean ompi-trunk and ompi-ddt:
all passed (except for the dynamic/ tests failed!! as trunk/MTT)
3. compilation and usage of HDF5 tests on Jaguar using PGI and
PathScale compilers.
4. compilation and usage on Scicortex.
- Please note, that for the heterogeneous case, (-m32 compiled
binaries/ompi), neither
ompi-trunk, nor ompi-ddt branch would successfully launch.
This commit was SVN r21641.
2009-07-13 04:56:31 +00:00
|
|
|
#include "ompi/datatype/ompi_datatype.h"
|
2008-02-12 18:01:17 +00:00
|
|
|
#include "ompi/memchecker.h"
|
2004-01-20 06:12:28 +00:00
|
|
|
|
2015-08-31 09:36:02 +09:00
|
|
|
#if OMPI_BUILD_MPI_PROFILING
|
|
|
|
#if OPAL_HAVE_WEAK_SYMBOLS
|
2004-01-20 06:12:28 +00:00
|
|
|
#pragma weak MPI_Alltoall = PMPI_Alltoall
|
|
|
|
#endif
|
2015-09-09 16:30:26 +09:00
|
|
|
#define MPI_Alltoall PMPI_Alltoall
|
2004-04-20 18:50:43 +00:00
|
|
|
#endif
|
|
|
|
|
2004-06-24 16:47:00 +00:00
|
|
|
static const char FUNC_NAME[] = "MPI_Alltoall";
|
2004-05-07 23:44:49 +00:00
|
|
|
|
|
|
|
|
2013-09-26 21:56:20 +00:00
|
|
|
int MPI_Alltoall(const void *sendbuf, int sendcount, MPI_Datatype sendtype,
|
2015-06-23 20:59:57 -07:00
|
|
|
void *recvbuf, int recvcount, MPI_Datatype recvtype,
|
|
|
|
MPI_Comm comm)
|
2004-05-07 23:44:49 +00:00
|
|
|
{
|
|
|
|
int err;
|
2015-10-24 15:25:28 -04:00
|
|
|
size_t recvtype_size;
|
2004-05-07 23:44:49 +00:00
|
|
|
|
2008-02-12 08:46:27 +00:00
|
|
|
MEMCHECKER(
|
2014-06-02 04:43:48 +00:00
|
|
|
memchecker_comm(comm);
|
|
|
|
if (MPI_IN_PLACE != sendbuf) {
|
|
|
|
memchecker_datatype(sendtype);
|
|
|
|
memchecker_call(&opal_memchecker_base_isdefined, (void *)sendbuf, sendcount, sendtype);
|
|
|
|
}
|
2008-02-12 08:46:27 +00:00
|
|
|
memchecker_datatype(recvtype);
|
2008-11-27 16:34:02 +00:00
|
|
|
memchecker_call(&opal_memchecker_base_isaddressable, recvbuf, recvcount, recvtype);
|
2008-02-12 08:46:27 +00:00
|
|
|
);
|
|
|
|
|
2004-05-07 23:44:49 +00:00
|
|
|
if (MPI_PARAM_CHECK) {
|
2004-06-29 00:02:25 +00:00
|
|
|
|
2012-05-24 13:41:51 +00:00
|
|
|
/* Unrooted operation -- same checks for all ranks on both
|
|
|
|
intracommunicators and intercommunicators */
|
|
|
|
|
|
|
|
err = MPI_SUCCESS;
|
|
|
|
OMPI_ERR_INIT_FINALIZE(FUNC_NAME);
|
|
|
|
if (ompi_comm_invalid(comm)) {
|
2015-06-23 20:59:57 -07:00
|
|
|
return OMPI_ERRHANDLER_INVOKE(MPI_COMM_WORLD, MPI_ERR_COMM,
|
2012-05-24 13:41:51 +00:00
|
|
|
FUNC_NAME);
|
2015-10-21 14:45:05 +09:00
|
|
|
} else if ((MPI_IN_PLACE == sendbuf && OMPI_COMM_IS_INTER(comm)) ||
|
|
|
|
MPI_IN_PLACE == recvbuf) {
|
2015-06-23 20:59:57 -07:00
|
|
|
return OMPI_ERRHANDLER_INVOKE(MPI_COMM_WORLD, MPI_ERR_ARG,
|
2014-05-19 07:46:07 +00:00
|
|
|
FUNC_NAME);
|
2012-05-24 13:41:51 +00:00
|
|
|
} else {
|
2015-10-24 15:25:28 -04:00
|
|
|
if(MPI_IN_PLACE != sendbuf) {
|
|
|
|
OMPI_CHECK_DATATYPE_FOR_SEND(err, sendtype, sendcount);
|
|
|
|
OMPI_ERRHANDLER_CHECK(err, comm, err, FUNC_NAME);
|
|
|
|
}
|
2014-05-19 07:46:07 +00:00
|
|
|
OMPI_CHECK_DATATYPE_FOR_RECV(err, recvtype, recvcount);
|
|
|
|
OMPI_ERRHANDLER_CHECK(err, comm, err, FUNC_NAME);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (MPI_IN_PLACE != sendbuf && !OMPI_COMM_IS_INTER(comm)) {
|
2015-10-24 15:25:28 -04:00
|
|
|
size_t sendtype_size, recvtype_size;
|
2014-05-19 07:46:07 +00:00
|
|
|
ompi_datatype_type_size(sendtype, &sendtype_size);
|
|
|
|
ompi_datatype_type_size(recvtype, &recvtype_size);
|
|
|
|
if ((sendtype_size*sendcount) != (recvtype_size*recvcount)) {
|
|
|
|
return OMPI_ERRHANDLER_INVOKE(comm, MPI_ERR_TRUNCATE, FUNC_NAME);
|
|
|
|
}
|
2012-05-24 13:41:51 +00:00
|
|
|
}
|
2004-05-07 23:44:49 +00:00
|
|
|
}
|
|
|
|
|
2015-12-15 13:33:43 +09:00
|
|
|
if (! OMPI_COMM_IS_INTER(comm)) {
|
|
|
|
ompi_datatype_type_size(recvtype, &recvtype_size);
|
Fix MPI_Alltoall to support inter-communicators.
Remove excessive parameter check to avoid premature exit from the collective.
MPI standard says:
The type signature associated with sendcount, sendtype, at a process must be equal to
the type signature associated with recvcount, recvtype at any other process. This implies
that the amount of data sent must be equal to the amount of data received, pairwise between
every pair of processes.
In case of inter-communicator we have 2 group of processes and "left" group may call
MPI_Alltoall(NULL, 0, MPI_INT, buf, 10, MPI_INT, comm, ...);
and the right one:
MPI_Alltoall(buf,10,MPI_INT, NULL, 0, MPI_INT, comm, ...);
And it would be legal though one of the group will receive 0 bytes from others.
This was triggered by MPICH/coll test called icalltoall.
2015-12-10 16:23:33 +06:00
|
|
|
if( (0 == recvcount) || (0 == recvtype_size) ) {
|
|
|
|
return MPI_SUCCESS;
|
|
|
|
}
|
2004-10-01 18:23:39 +00:00
|
|
|
}
|
|
|
|
|
2008-02-19 22:15:52 +00:00
|
|
|
OPAL_CR_ENTER_LIBRARY();
|
|
|
|
|
2004-06-29 00:02:25 +00:00
|
|
|
/* Invoke the coll component to perform the back-end operation */
|
2015-08-28 16:43:13 +09:00
|
|
|
err = comm->c_coll.coll_alltoall(sendbuf, sendcount, sendtype,
|
2004-06-29 00:02:25 +00:00
|
|
|
recvbuf, recvcount, recvtype,
|
2007-08-19 03:37:49 +00:00
|
|
|
comm, comm->c_coll.coll_alltoall_module);
|
2004-06-29 00:02:25 +00:00
|
|
|
OMPI_ERRHANDLER_RETURN(err, comm, err, FUNC_NAME);
|
2004-01-20 06:12:28 +00:00
|
|
|
}
|
|
|
|
|