
complete, but stable enough that it will have no impact on general development, so into the trunk it goes. Changes in this commit include: - Remove the --with option for disabling MPI-2 onesided support. It complicated code, and has no real reason for existing - add a framework osc (OneSided Communication) for encapsulating all the MPI-2 onesided functionality - Modify the MPI interface functions for the MPI-2 onesided chapter to properly call the underlying framework and do the required error checking - Created an osc component pt2pt, which is layered over the BML/BTL for communication (although it also uses the PML for long message transfers). Currently, all support functions, all communication functions (Put, Get, Accumulate), and the Fence synchronization function are implemented. The PWSC active synchronization functions and Lock/Unlock passive synchronization functions are still not implemented This commit was SVN r8836.
210 строки
5.2 KiB
C
210 строки
5.2 KiB
C
/*
|
|
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
|
* University Research and Technology
|
|
* Corporation. All rights reserved.
|
|
* Copyright (c) 2004-2005 The University of Tennessee and The University
|
|
* of Tennessee Research Foundation. All rights
|
|
* reserved.
|
|
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
|
* University of Stuttgart. All rights reserved.
|
|
* Copyright (c) 2004-2005 The Regents of the University of California.
|
|
* All rights reserved.
|
|
* $COPYRIGHT$
|
|
*
|
|
* Additional copyrights may follow
|
|
*
|
|
* $HEADER$
|
|
*/
|
|
|
|
#include "ompi_config.h"
|
|
|
|
#include "mpi.h"
|
|
#include "win/win.h"
|
|
#include "errhandler/errhandler.h"
|
|
#include "include/constants.h"
|
|
#include "attribute/attribute.h"
|
|
#include "group/group.h"
|
|
#include "info/info.h"
|
|
#include "mca/osc/base/base.h"
|
|
#include "mca/osc/osc.h"
|
|
|
|
ompi_win_t ompi_mpi_win_null;
|
|
|
|
static void ompi_win_construct(ompi_win_t *win);
|
|
static void ompi_win_destruct(ompi_win_t *win);
|
|
|
|
OBJ_CLASS_INSTANCE(ompi_win_t, opal_object_t,
|
|
ompi_win_construct, ompi_win_destruct);
|
|
|
|
int
|
|
ompi_win_init(void)
|
|
{
|
|
OBJ_CONSTRUCT(&ompi_mpi_win_null, ompi_win_t);
|
|
ompi_mpi_win_null.w_flags = OMPI_WIN_INVALID;
|
|
ompi_mpi_win_null.w_group = &ompi_mpi_group_null;
|
|
ompi_win_set_name(&ompi_mpi_win_null, "MPI_WIN_NULL");
|
|
|
|
return OMPI_SUCCESS;
|
|
}
|
|
|
|
|
|
int
|
|
ompi_win_finalize(void)
|
|
{
|
|
OBJ_DESTRUCT(&ompi_mpi_win_null);
|
|
|
|
return OMPI_SUCCESS;
|
|
}
|
|
|
|
|
|
int
|
|
ompi_win_create(void *base, long size,
|
|
int disp_unit, ompi_communicator_t *comm,
|
|
ompi_info_t *info,
|
|
ompi_win_t** newwin)
|
|
{
|
|
ompi_win_t *win;
|
|
ompi_group_t *group;
|
|
int ret;
|
|
|
|
/* create the object */
|
|
win = OBJ_NEW(ompi_win_t);
|
|
if (NULL == win) return OMPI_ERR_TEMP_OUT_OF_RESOURCE;
|
|
|
|
/* setup data that is independent of osc component */
|
|
group = comm->c_local_group;
|
|
OBJ_RETAIN(group);
|
|
ompi_group_increment_proc_count(group);
|
|
win->w_group = group;
|
|
|
|
win->w_baseptr = base;
|
|
win->w_size = size;
|
|
win->w_disp_unit = disp_unit;
|
|
|
|
/* Fill in required attributes */
|
|
ret = ompi_attr_set_c(WIN_ATTR, win, &win->w_keyhash,
|
|
MPI_WIN_BASE, win->w_baseptr, true, true);
|
|
if (OMPI_SUCCESS != ret) {
|
|
OBJ_RELEASE(win);
|
|
return ret;
|
|
}
|
|
ret = ompi_attr_set_fortran_mpi2(WIN_ATTR, win,
|
|
&win->w_keyhash,
|
|
MPI_WIN_SIZE, win->w_size, true, true);
|
|
if (OMPI_SUCCESS != ret) {
|
|
OBJ_RELEASE(win);
|
|
return ret;
|
|
}
|
|
ret = ompi_attr_set_fortran_mpi2(WIN_ATTR, win,
|
|
&win->w_keyhash,
|
|
MPI_WIN_DISP_UNIT, win->w_disp_unit,
|
|
true, true);
|
|
if (OMPI_SUCCESS != ret) {
|
|
OBJ_RELEASE(win);
|
|
return ret;
|
|
}
|
|
|
|
/* create backend onesided module for this window */
|
|
ret = ompi_osc_base_select(win, (ompi_info_t*) info, comm);
|
|
if (OMPI_SUCCESS != ret) {
|
|
OBJ_RELEASE(win);
|
|
return ret;
|
|
}
|
|
|
|
*newwin = win;
|
|
|
|
return OMPI_SUCCESS;
|
|
}
|
|
|
|
|
|
int
|
|
ompi_win_free(ompi_win_t *win)
|
|
{
|
|
int ret = win->w_osc_module->osc_free(win);
|
|
|
|
if (OMPI_SUCCESS == ret) {
|
|
OBJ_RELEASE(win);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
|
|
int
|
|
ompi_win_set_name(ompi_win_t *win, char *win_name)
|
|
{
|
|
OPAL_THREAD_LOCK(&(win->w_lock));
|
|
memset(win->w_name, 0, MPI_MAX_OBJECT_NAME);
|
|
strncpy(win->w_name, win_name, MPI_MAX_OBJECT_NAME);
|
|
win->w_name[MPI_MAX_OBJECT_NAME - 1] = 0;
|
|
OPAL_THREAD_UNLOCK(&(win->w_lock));
|
|
|
|
return OMPI_SUCCESS;
|
|
}
|
|
|
|
|
|
int
|
|
ompi_win_get_name(ompi_win_t *win, char *win_name, int *length)
|
|
{
|
|
OPAL_THREAD_LOCK(&(win->w_lock));
|
|
strncpy(win_name, win->w_name, MPI_MAX_OBJECT_NAME);
|
|
*length = strlen(win->w_name);
|
|
OPAL_THREAD_UNLOCK(&(win->w_lock));
|
|
|
|
return OMPI_SUCCESS;
|
|
}
|
|
|
|
|
|
int
|
|
ompi_win_group(ompi_win_t *win, ompi_group_t **group) {
|
|
OBJ_RETAIN(win->w_group);
|
|
ompi_group_increment_proc_count(win->w_group);
|
|
*group = win->w_group;
|
|
|
|
return OMPI_SUCCESS;
|
|
}
|
|
|
|
|
|
static void
|
|
ompi_win_construct(ompi_win_t *win)
|
|
{
|
|
OBJ_CONSTRUCT(&win->w_lock, opal_mutex_t);
|
|
win->w_name[0] = '\0';
|
|
win->w_group = NULL;
|
|
win->w_keyhash = NULL;
|
|
win->w_f_to_c_index = 0;
|
|
|
|
/* every new window defaults to MPI_ERRORS_ARE_FATAL (MPI-2 6.6.1,
|
|
pg. 137) */
|
|
OBJ_RETAIN(&ompi_mpi_errors_are_fatal);
|
|
win->error_handler = &ompi_mpi_errors_are_fatal;
|
|
win->errhandler_type = OMPI_ERRHANDLER_TYPE_WIN;
|
|
|
|
win->w_disp_unit = 0;
|
|
win->w_flags = 0;
|
|
win->w_baseptr = NULL;
|
|
win->w_size = 0;
|
|
win->w_osc_module = NULL;
|
|
}
|
|
|
|
|
|
static void
|
|
ompi_win_destruct(ompi_win_t *win)
|
|
{
|
|
if (NULL != win->w_keyhash) {
|
|
ompi_attr_delete_all(WIN_ATTR, win, win->w_keyhash);
|
|
OBJ_RELEASE(win->w_keyhash);
|
|
}
|
|
|
|
if (NULL != win->error_handler) {
|
|
OBJ_RELEASE(win->error_handler);
|
|
}
|
|
|
|
if (NULL != win->w_group) {
|
|
ompi_group_decrement_proc_count(win->w_group);
|
|
OBJ_RELEASE(win->w_group);
|
|
}
|
|
|
|
OBJ_DESTRUCT(&win->w_lock);
|
|
}
|