1
1

front end funcitions for coll and some dt functions

This commit was SVN r1126.
Этот коммит содержится в:
Vishal Sahay 2004-05-07 23:44:49 +00:00
родитель 037d7e39fc
Коммит 148689e3d1
9 изменённых файлов: 393 добавлений и 19 удалений

Просмотреть файл

@ -7,6 +7,8 @@
#include "mpi.h"
#include "mpi/c/bindings.h"
#include "mca/coll/coll.h"
#include "communicator/communicator.h"
#if LAM_HAVE_WEAK_SYMBOLS && LAM_PROFILING_DEFINES
#pragma weak MPI_Allgather = PMPI_Allgather
@ -16,10 +18,42 @@
#include "mpi/c/profile/defines.h"
#endif
static char FUNC_NAME[] = "MPI_Allgather";
int MPI_Allgather(void *sendbuf, int sendcount, MPI_Datatype sendtype,
void *recvbuf, int recvcount, MPI_Datatype recvtype,
MPI_Comm comm) {
return MPI_SUCCESS;
MPI_Comm comm)
{
int err;
mca_coll_base_allgather_fn_t func;
if (MPI_PARAM_CHECK) {
if (MPI_COMM_NULL == comm) {
return LAM_ERRHANDLER_INVOKE(MPI_COMM_WORLD, MPI_ERR_COMM,
FUNC_NAME);
}
if ((MPI_DATATYPE_NULL == sendtype)
|| (MPI_DATATYPE_NULL == recvtype)) {
return LAM_ERRHANDLER_INVOKE(comm, MPI_ERR_TYPE, FUNC_NAME);
}
if ((sendcount < 0) || (recvcount < 0)) {
return LAM_ERRHANDLER_INVOKE(comm, MPI_ERR_COUNT, FUNC_NAME);
}
}
func = comm->c_coll.coll_allgather_intra;
if (NULL == func) {
return LAM_ERRHANDLER_INVOKE(comm, MPI_ERR_OTHER, FUNC_NAME);
}
/* Call the coll SSI to actually perform the allgather */
err = func(sendbuf, sendcount, sendtype, recvbuf, recvcount,
recvtype, comm);
LAM_ERRHANDLER_RETURN(err, comm, MPI_ERR_UNKNOWN, FUNC_NAME);
}

Просмотреть файл

@ -7,6 +7,8 @@
#include "mpi.h"
#include "mpi/c/bindings.h"
#include "mca/coll/coll.h"
#include "communicator/communicator.h"
#if LAM_HAVE_WEAK_SYMBOLS && LAM_PROFILING_DEFINES
#pragma weak MPI_Alltoall = PMPI_Alltoall
@ -16,9 +18,47 @@
#include "mpi/c/profile/defines.h"
#endif
static char FUNC_NAME[] = "MPI_Alltoall";
int MPI_Alltoall(void *sendbuf, int sendcount, MPI_Datatype sendtype,
void *recvbuf, int recvcount,
MPI_Datatype recvtype, MPI_Comm comm) {
return MPI_SUCCESS;
MPI_Datatype recvtype, MPI_Comm comm)
{
int err;
mca_coll_base_alltoall_fn_t func;
if (MPI_PARAM_CHECK) {
if (MPI_COMM_NULL == comm) {
return LAM_ERRHANDLER_INVOKE(MPI_COMM_WORLD, MPI_ERR_COMM,
FUNC_NAME);
}
if ((NULL == sendbuf) || (NULL == recvbuf)) {
return LAM_ERRHANDLER_INVOKE(comm, MPI_ERR_ARG, FUNC_NAME);
}
if ((MPI_DATATYPE_NULL == sendtype) || (MPI_DATATYPE_NULL == recvtype)) {
return LAM_ERRHANDLER_INVOKE(comm, MPI_ERR_TYPE, FUNC_NAME);
}
if ((sendcount < 0) || (recvcount < 0)) {
return LAM_ERRHANDLER_INVOKE(comm, MPI_ERR_COUNT, FUNC_NAME);
}
}
/* VPS: Need to change this to another pointer, because we wont have
two pointers - intra and inter - cached in the new design */
func = comm->c_coll.coll_alltoall_intra;
if (NULL == func) {
return LAM_ERRHANDLER_INVOKE(comm, MPI_ERR_OTHER, FUNC_NAME);
}
err = func(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype,
comm);
LAM_ERRHANDLER_RETURN((err != MPI_SUCCESS), comm, MPI_ERR_UNKNOWN,
FUNC_NAME);
}

Просмотреть файл

@ -6,6 +6,9 @@
#include "mpi.h"
#include "mpi/c/bindings.h"
#include "mca/coll/coll.h"
#include "errhandler/errhandler.h"
#include "communicator/communicator.h"
#if LAM_HAVE_WEAK_SYMBOLS && LAM_PROFILING_DEFINES
#pragma weak MPI_Barrier = PMPI_Barrier
@ -15,6 +18,36 @@
#include "mpi/c/profile/defines.h"
#endif
int MPI_Barrier(MPI_Comm comm) {
static char FUNC_NAME[] = "MPI_Barrier";
int MPI_Barrier(MPI_Comm comm)
{
int err;
mca_coll_base_barrier_fn_t func;
if (MPI_PARAM_CHECK) {
if (MPI_COMM_NULL == comm) {
return LAM_ERRHANDLER_INVOKE(MPI_COMM_WORLD, MPI_ERR_COMM,
FUNC_NAME);
}
}
/* Obvious case */
if (lam_comm_size(comm) <= 1) {
return MPI_SUCCESS;
}
/* VPS: Need to change this to another pointer, because we wont have
two pointers - intra and inter - cached in the new design */
func = comm->c_coll.coll_barrier_intra;
if (NULL == func) {
return LAM_ERRHANDLER_INVOKE(comm, MPI_ERR_OTHER, FUNC_NAME);
}
err = func(comm);
LAM_ERRHANDLER_RETURN(err, comm, MPI_ERR_UNKNOWN, FUNC_NAME);
}

Просмотреть файл

@ -6,6 +6,8 @@
#include "mpi.h"
#include "mpi/c/bindings.h"
#include "mca/coll/coll.h"
#include "communicator/communicator.h"
#if LAM_HAVE_WEAK_SYMBOLS && LAM_PROFILING_DEFINES
#pragma weak MPI_Bcast = PMPI_Bcast
@ -15,7 +17,64 @@
#include "mpi/c/profile/defines.h"
#endif
static char FUNC_NAME[] = "MPI_Bcast";
int MPI_Bcast(void *buffer, int count, MPI_Datatype datatype,
int root, MPI_Comm comm) {
return MPI_SUCCESS;
int root, MPI_Comm comm)
{
int size, err;
mca_coll_base_bcast_fn_t func;
if (MPI_PARAM_CHECK) {
if (MPI_COMM_NULL == comm) {
return LAM_ERRHANDLER_INVOKE(MPI_COMM_WORLD, MPI_ERR_COMM,
FUNC_NAME);
}
if (NULL == buffer) {
return LAM_ERRHANDLER_INVOKE(comm, MPI_ERR_ARG, FUNC_NAME);
}
if (MPI_DATATYPE_NULL == datatype) {
return LAM_ERRHANDLER_INVOKE(comm, MPI_ERR_TYPE, FUNC_NAME);
}
if (count < 0) {
return LAM_ERRHANDLER_INVOKE(comm, MPI_ERR_COUNT, FUNC_NAME);
}
}
if (LAM_COMM_IS_INTRA(comm)) {
MPI_Comm_size(comm, &size);
if ((root >= size) || (root < 0)) {
return LAM_ERRHANDLER_INVOKE(comm, MPI_ERR_ROOT, FUNC_NAME);
}
if (count == 0 && comm->c_coll.coll_bcast_optimization) {
return(MPI_SUCCESS);
}
/* If there's only one node, we're done */
else if (size <= 1) {
return(MPI_SUCCESS);
}
} else {
MPI_Comm_remote_size(comm, &size);
if (!(((root < size) && (root >= 0))
|| (root == MPI_ROOT) || (root == MPI_PROC_NULL))) {
return LAM_ERRHANDLER_INVOKE(comm, MPI_ERR_ROOT, FUNC_NAME);
}
}
/* VPS: Need to change this to another pointer, because we wont have
two pointers - intra and inter - cached in the new design */
func = comm->c_coll.coll_bcast_intra;
if (NULL == func)
return MPI_ERR_OTHER;
err = func(buffer, count, datatype, root, comm);
LAM_ERRHANDLER_RETURN(err, comm, MPI_ERR_UNKNOWN, FUNC_NAME);
}

Просмотреть файл

@ -6,6 +6,8 @@
#include "mpi.h"
#include "mpi/c/bindings.h"
#include "mca/coll/coll.h"
#include "communicator/communicator.h"
#if LAM_HAVE_WEAK_SYMBOLS && LAM_PROFILING_DEFINES
#pragma weak MPI_Gather = PMPI_Gather
@ -15,8 +17,62 @@
#include "mpi/c/profile/defines.h"
#endif
static char FUNC_NAME[] = "MPI_Gather";
int MPI_Gather(void *sendbuf, int sendcount, MPI_Datatype sendtype,
void *recvbuf, int recvcount, MPI_Datatype recvtype,
int root, MPI_Comm comm) {
return MPI_SUCCESS;
int root, MPI_Comm comm)
{
int rank;
int size;
int err;
mca_coll_base_gather_fn_t func;
if (MPI_PARAM_CHECK) {
if (MPI_COMM_NULL == comm) {
return LAM_ERRHANDLER_INVOKE(MPI_COMM_WORLD, MPI_ERR_COMM,
FUNC_NAME);
}
}
func = comm->c_coll.coll_gather_intra;
if (LAM_COMM_IS_INTRA(comm)) {
/* conditions for intracomm */
MPI_Comm_size(comm, &size);
MPI_Comm_rank(comm, &rank);
if ((root >= size) || (root < 0)) {
return LAM_ERRHANDLER_INVOKE(comm, MPI_ERR_ROOT, FUNC_NAME);
}
if ((sendcount < 0) || (rank == root && recvcount < 0)) {
return LAM_ERRHANDLER_INVOKE(comm, MPI_ERR_COUNT, FUNC_NAME);
}
if ((sendtype == MPI_DATATYPE_NULL) ||
(rank == root && recvtype == MPI_DATATYPE_NULL)) {
return LAM_ERRHANDLER_INVOKE(comm, MPI_ERR_TYPE, FUNC_NAME);
}
} else {
/* Conditions for intercomm */
MPI_Comm_remote_size(comm, &size);
if (((root != MPI_PROC_NULL) && (sendtype == MPI_DATATYPE_NULL)) ||
(root == MPI_ROOT && recvtype == MPI_DATATYPE_NULL)) {
return LAM_ERRHANDLER_INVOKE(comm, MPI_ERR_TYPE, FUNC_NAME);
}
if (!(((root < size) && (root >= 0))
|| (root == MPI_ROOT) || (root == MPI_PROC_NULL))) {
return LAM_ERRHANDLER_INVOKE(comm, MPI_ERR_ROOT, FUNC_NAME);
}
}
if (func == NULL) {
return LAM_ERRHANDLER_INVOKE(comm, MPI_ERR_OTHER, FUNC_NAME);
}
/* Call the coll SSI to actually perform the bcast */
err = func(sendbuf, sendcount, sendtype, recvbuf,
recvcount, recvtype, root, comm);
LAM_ERRHANDLER_RETURN(err, comm, MPI_ERR_UNKNOWN, FUNC_NAME);
}

Просмотреть файл

@ -58,7 +58,7 @@ int MPI_Group_excl(MPI_Group group, int n, int *ranks,
/* put group elements in the list */
cnt=0;
for (proc = 0; proc < n; proc++) {
for (proc = 0; proc < group_pointer->grp_proc_count; proc++) {
found=0;
/* check to see if this proc is in the exclusion list */
for( i_excl=0 ; i_excl < n ; ++i_excl ) {

Просмотреть файл

@ -6,6 +6,10 @@
#include "mpi.h"
#include "mpi/c/bindings.h"
#include "datatype/datatype.h"
#include "errhandler/errhandler.h"
#include "communicator/communicator.h"
#include "lfc/lam_object.h"
#if LAM_HAVE_WEAK_SYMBOLS && LAM_PROFILING_DEFINES
#pragma weak MPI_Pack = PMPI_Pack
@ -15,7 +19,68 @@
#include "mpi/c/profile/defines.h"
#endif
/* VPS: Just for now, to be removed later */
extern lam_convertor_t *lam_convertor;
static char FUNC_NAME[] = "MPI_Pack";
int MPI_Pack(void *inbuf, int incount, MPI_Datatype datatype,
void *outbuf, int outsize, int *position, MPI_Comm comm) {
return MPI_SUCCESS;
void *outbuf, int outsize, int *position, MPI_Comm comm)
{
int size, rc;
lam_convertor_t *local_convertor;
struct iovec invec;
if (MPI_PARAM_CHECK) {
if (MPI_COMM_NULL == comm) {
return LAM_ERRHANDLER_INVOKE(MPI_COMM_WORLD, MPI_ERR_COMM, FUNC_NAME);
}
if ((NULL == inbuf) || (NULL == outbuf) || (NULL == position)) {
return LAM_ERRHANDLER_INVOKE(comm, MPI_ERR_ARG, FUNC_NAME);
}
#if 0
if (count < 0) {
return LAM_ERRHANDLER_INVOKE(comm, MPI_ERR_COUNT, FUNC_NAME);
}
#endif
if (outsize < 0) {
return LAM_ERRHANDLER_INVOKE(comm, MPI_ERR_ARG, FUNC_NAME);
}
if (MPI_DATATYPE_NULL == datatype) {
return LAM_ERRHANDLER_INVOKE(comm, MPI_ERR_TYPE, FUNC_NAME);
}
}
local_convertor = lam_convertor_get_copy(lam_convertor);
lam_convertor_init_for_send(local_convertor, 0, datatype, incount,
inbuf, 0);
/* how long is the data ? Can we put it in the user buffer */
lam_convertor_get_packed_size(local_convertor, &size);
if( (outsize - (*position)) < size) {
return LAM_ERRHANDLER_INVOKE(comm, MPI_ERR_ARG, FUNC_NAME);
}
/* Prepare the iovec withh all informations */
invec.iov_base = (char*)outbuf + (*position);
/* If the position is not ZERO we already start
* the packing for this datatype.
*/
invec.iov_len = outsize - (*position);
/* Do the actual packing */
rc = lam_convertor_pack(local_convertor, &invec, 1);
*position += local_convertor->bConverted;
/* Release the convertor. For Open MPI you should simply use
* OBJ_RELEASE.
*/
OBJ_RELEASE(local_convertor);
LAM_ERRHANDLER_RETURN(rc, comm, MPI_ERR_UNKNOWN, FUNC_NAME);
}

Просмотреть файл

@ -6,6 +6,10 @@
#include "mpi.h"
#include "mpi/c/bindings.h"
#include "lfc/lam_object.h"
#include "errhandler/errhandler.h"
#include "communicator/communicator.h"
#include "datatype/datatype.h"
#if LAM_HAVE_WEAK_SYMBOLS && LAM_PROFILING_DEFINES
#pragma weak MPI_Pack_size = PMPI_Pack_size
@ -15,7 +19,32 @@
#include "mpi/c/profile/defines.h"
#endif
static char FUNC_NAME[] = "MPI_Pack_size";
int MPI_Pack_size(int incount, MPI_Datatype datatype, MPI_Comm comm,
int *size) {
return MPI_SUCCESS;
int *size)
{
int ret;
lam_convertor_t *local_convertor;
if (MPI_PARAM_CHECK) {
if (MPI_COMM_NULL == comm) {
return LAM_ERRHANDLER_INVOKE(MPI_COMM_WORLD, MPI_ERR_COMM, FUNC_NAME);
}
if (NULL == size) {
return LAM_ERRHANDLER_INVOKE(comm, MPI_ERR_ARG, FUNC_NAME);
}
if (MPI_DATATYPE_NULL == datatype) {
return LAM_ERRHANDLER_INVOKE(comm, MPI_ERR_TYPE, FUNC_NAME);
}
}
lam_convertor_init_for_send(local_convertor, 0, datatype,
incount, 0, NULL);
ret = lam_convertor_get_packed_size(local_convertor, size);
OBJ_RELEASE(local_convertor);
LAM_ERRHANDLER_RETURN((ret >= 0), comm, MPI_ERR_UNKNOWN, FUNC_NAME);
}

Просмотреть файл

@ -6,6 +6,10 @@
#include "mpi.h"
#include "mpi/c/bindings.h"
#include "datatype/datatype.h"
#include "errhandler/errhandler.h"
#include "communicator/communicator.h"
#include "lfc/lam_object.h"
#if LAM_HAVE_WEAK_SYMBOLS && LAM_PROFILING_DEFINES
#pragma weak MPI_Unpack = PMPI_Unpack
@ -15,8 +19,62 @@
#include "mpi/c/profile/defines.h"
#endif
static char FUNC_NAME[] = "MPI_Unpack";
int MPI_Unpack(void *inbuf, int insize, int *position,
void *outbuf, int outcount, MPI_Datatype datatype,
MPI_Comm comm) {
return MPI_SUCCESS;
MPI_Comm comm)
{
int size, rc;
lam_convertor_t *local_convertor;
struct iovec outvec;
if (MPI_PARAM_CHECK) {
if (MPI_COMM_NULL == comm) {
return LAM_ERRHANDLER_INVOKE(MPI_COMM_WORLD, MPI_ERR_COMM,
"MPI_Unpack");
}
if ((NULL == inbuf) || (NULL == outbuf) || (NULL == position)) {
return LAM_ERRHANDLER_INVOKE(comm, MPI_ERR_ARG, FUNC_NAME);
}
if (outcount < 0) {
return LAM_ERRHANDLER_INVOKE(comm, MPI_ERR_COUNT, FUNC_NAME);
}
if (MPI_DATATYPE_NULL == datatype) {
return LAM_ERRHANDLER_INVOKE(comm, MPI_ERR_TYPE, FUNC_NAME);
}
}
local_convertor = lam_convertor_get_copy(local_convertor);
lam_convertor_init_for_recv(local_convertor, 0, datatype, outcount,
inbuf, 0);
/* how long is the data ? Can we put it in the user buffer */
lam_convertor_get_packed_size(local_convertor, &size);
if ((outcount - (*position)) < size) {
return LAM_ERRHANDLER_INVOKE(comm, MPI_ERR_ARG, FUNC_NAME);
}
/* Prepare the iovec withh all informations */
outvec.iov_base = (char*) inbuf + (*position);
/* If the position is not ZERO we already start
* the packing for this datatype.
*/
outvec.iov_len = insize - (*position);
/* Do the actual unpacking */
rc = lam_convertor_unpack(local_convertor, &outvec, 1);
*position += local_convertor->bConverted;
/* Release the convertor. For Open MPI you should simply use
* OBJ_RELEASE.
*/
OBJ_RELEASE(local_convertor);
LAM_ERRHANDLER_RETURN(rc, comm, MPI_ERR_UNKNOWN, FUNC_NAME);
}