1
1

Bring Portals4 updates back into the trunk

This commit was SVN r24154.
Этот коммит содержится в:
Brian Barrett 2010-12-07 20:11:25 +00:00
родитель 2dc5cbb483
Коммит a26fadb26e
14 изменённых файлов: 1399 добавлений и 297 удалений

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

@ -10,6 +10,7 @@
# Copyright (c) 2004-2005 The Regents of the University of California.
# All rights reserved.
# Copyright (c) 2010 Cisco Systems, Inc. All rights reserved.
# Copyright (c) 2010 Sandia National Laboratories. All rights reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow
@ -32,14 +33,16 @@ component_install =
endif
local_sources = \
mtl_portals4_component.c \
mtl_portals4.c \
mtl_portals4.h \
mtl_portals4_component.c \
mtl_portals4_endpoint.h \
mtl_portals4.h \
mtl_portals4_probe.c \
mtl_portals4_recv.c \
mtl_portals4_recv_short.c \
mtl_portals4_recv_short.h \
mtl_portals4_request.h \
mtl_portals4_send.c \
mtl_portals4_probe.c
mtl_portals4_send.c
mcacomponentdir = $(pkglibdir)
mcacomponent_LTLIBRARIES = $(component_install)
@ -52,4 +55,3 @@ noinst_LTLIBRARIES = $(component_noinst)
libmca_mtl_portals4_la_SOURCES = $(local_sources)
libmca_mtl_portals4_la_LIBADD = $(mtl_portals4_LIBS)
libmca_mtl_portals4_la_LDFLAGS = -module -avoid-version $(mtl_portals4_LDFLAGS)

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

@ -11,6 +11,7 @@
# Copyright (c) 2004-2005 The Regents of the University of California.
# All rights reserved.
# Copyright (c) 2010 Cisco Systems, Inc. All rights reserved.
# Copyright (c) 2010 Sandia National Laboratories. All rights reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow

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

@ -1,5 +1,15 @@
/*
* Copyright (c) 2010 Sandia National Laboratories. All rights reserved.
* Copyright (c) 2004-2006 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 (c) 2010 Sandia National Laboratories. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -13,10 +23,12 @@
#include <portals4_runtime.h>
#include "ompi/mca/mtl/mtl.h"
#include "opal/class/opal_list.h"
#include "mtl_portals4.h"
#include "mtl_portals4_endpoint.h"
#include "mtl_portals4_request.h"
#include "mtl_portals4_recv_short.h"
mca_mtl_portals4_module_t ompi_mtl_portals4 = {
{
@ -29,7 +41,7 @@ mca_mtl_portals4_module_t ompi_mtl_portals4 = {
ompi_mtl_portals4_del_procs,
ompi_mtl_portals4_finalize,
ompi_mtl_portals4_send,
NULL, /* send */
ompi_mtl_portals4_isend,
ompi_mtl_portals4_irecv,
ompi_mtl_portals4_iprobe,
@ -41,27 +53,152 @@ mca_mtl_portals4_module_t ompi_mtl_portals4 = {
int
ompi_mtl_portals4_add_procs(struct mca_mtl_base_module_t *mtl,
size_t nprocs,
struct ompi_proc_t** procs,
struct mca_mtl_base_endpoint_t **mtl_peer_data)
size_t nprocs,
struct ompi_proc_t** procs,
struct mca_mtl_base_endpoint_t **mtl_peer_data)
{
mca_mtl_portals4_module_t *mtl_portals4 = (mca_mtl_portals4_module_t*) mtl;
int i;
struct runtime_proc_t *world_procs;
int world_size = runtime_get_size();
runtime_get_nidpid_map(&world_procs);
if (world_size != (int) nprocs) return OMPI_ERROR;
mtl_portals4->endpoints = malloc(sizeof(struct mca_mtl_base_endpoint_t) * nprocs);
if (NULL == mtl_portals4->endpoints) {
return OMPI_ERROR;
int ret;
ptl_md_t md;
ptl_me_t me;
size_t i;
struct runtime_proc_t *ptlprocs;
int nptlprocs;
ptl_pt_index_t pt;
/* create event queue */
ret = PtlEQAlloc(ompi_mtl_portals4.ni_h,
ompi_mtl_portals4.queue_size,
&(ompi_mtl_portals4.eq_h));
if (PTL_OK != ret) {
opal_output(ompi_mtl_base_output,
"%s:%d: PtlEQAlloc failed: %d\n",
__FILE__, __LINE__, ret);
return ompi_mtl_portals4_get_error(ret);
}
for (i = 0 ; i < (int) nprocs ; ++i) {
mtl_peer_data[i] = &(mtl_portals4->endpoints[i]);
mtl_peer_data[i]->ptl_proc.phys.nid = world_procs[i].nid;
mtl_peer_data[i]->ptl_proc.phys.pid = world_procs[i].pid;
/* Create portal table entries */
ret = PtlPTAlloc(ompi_mtl_portals4.ni_h,
PTL_PT_FLOWCTRL,
ompi_mtl_portals4.eq_h,
PTL_SEND_TABLE_ID,
&pt);
if (PTL_OK != ret) {
PtlEQFree(ompi_mtl_portals4.eq_h);
opal_output(ompi_mtl_base_output,
"%s:%d: PtlPTAlloc failed: %d\n",
__FILE__, __LINE__, ret);
return ompi_mtl_portals4_get_error(ret);
}
ret = PtlPTAlloc(ompi_mtl_portals4.ni_h,
PTL_PT_FLOWCTRL,
ompi_mtl_portals4.eq_h,
PTL_READ_TABLE_ID,
&pt);
if (PTL_OK != ret) {
PtlPTFree(ompi_mtl_portals4.ni_h, PTL_SEND_TABLE_ID);
PtlEQFree(ompi_mtl_portals4.eq_h);
opal_output(ompi_mtl_base_output,
"%s:%d: PtlPTAlloc failed: %d\n",
__FILE__, __LINE__, ret);
return ompi_mtl_portals4_get_error(ret);
}
/* bind zero-length md for sending acks */
md.start = NULL;
md.length = 0;
md.options = 0;
md.eq_handle = PTL_EQ_NONE;
md.ct_handle = PTL_CT_NONE;
ret = PtlMDBind(ompi_mtl_portals4.ni_h,
&md,
&ompi_mtl_portals4.zero_md_h );
if (PTL_OK != ret) {
PtlPTFree(ompi_mtl_portals4.ni_h, PTL_READ_TABLE_ID);
PtlPTFree(ompi_mtl_portals4.ni_h, PTL_SEND_TABLE_ID);
PtlEQFree(ompi_mtl_portals4.eq_h);
opal_output(ompi_mtl_base_output,
"%s:%d: PtlMDBind failed: %d\n",
__FILE__, __LINE__, ret);
return ompi_mtl_portals4_get_error(ret);
}
/* Handle long overflows */
me.start = NULL;
me.length = 0;
me.ct_handle = PTL_CT_NONE;
me.min_free = 0;
me.ac_id.uid = PTL_UID_ANY;
me.options = PTL_ME_OP_PUT;
me.match_id.phys.nid = PTL_NID_ANY;
me.match_id.phys.pid = PTL_PID_ANY;
me.match_bits = PTL_LONG_MSG;
me.ignore_bits = PTL_CONTEXT_MASK | PTL_SOURCE_MASK | PTL_TAG_MASK;
ompi_mtl_portals4.long_overflow_request.event_callback =
ompi_mtl_portals4_recv_progress;
ret = PtlMEAppend(ompi_mtl_portals4.ni_h,
PTL_SEND_TABLE_ID,
&me,
PTL_OVERFLOW,
&ompi_mtl_portals4.long_overflow_request,
&ompi_mtl_portals4.long_overflow_me_h);
if (PTL_OK != ret) {
PtlMDRelease(ompi_mtl_portals4.zero_md_h);
PtlPTFree(ompi_mtl_portals4.ni_h, PTL_READ_TABLE_ID);
PtlPTFree(ompi_mtl_portals4.ni_h, PTL_SEND_TABLE_ID);
PtlEQFree(ompi_mtl_portals4.eq_h);
opal_output(ompi_mtl_base_output,
"%s:%d: PtlMEAppend failed: %d\n",
__FILE__, __LINE__, ret);
return ompi_mtl_portals4_get_error(ret);
}
/* attach short unex recv blocks */
ret = ompi_mtl_portals4_recv_short_init((mca_mtl_portals4_module_t*) mtl);
if (OMPI_SUCCESS != ret) {
PtlMEUnlink(ompi_mtl_portals4.long_overflow_me_h);
PtlMDRelease(ompi_mtl_portals4.zero_md_h);
PtlPTFree(ompi_mtl_portals4.ni_h, PTL_READ_TABLE_ID);
PtlPTFree(ompi_mtl_portals4.ni_h, PTL_SEND_TABLE_ID);
PtlEQFree(ompi_mtl_portals4.eq_h);
opal_output(ompi_mtl_base_output,
"%s:%d: short receive block initialization failed: %d\n",
__FILE__, __LINE__, ret);
return ret;
}
/* activate progress callback */
opal_progress_register(ompi_mtl_portals4_progress);
/* Get the list of ptl_process_id_t from the runtime and copy into structure */
nptlprocs = runtime_get_nidpid_map(&ptlprocs);
if ((size_t)nptlprocs != nprocs) {
PtlMEUnlink(ompi_mtl_portals4.long_overflow_me_h);
PtlMDRelease(ompi_mtl_portals4.zero_md_h);
PtlPTFree(ompi_mtl_portals4.ni_h, PTL_READ_TABLE_ID);
PtlPTFree(ompi_mtl_portals4.ni_h, PTL_SEND_TABLE_ID);
PtlEQFree(ompi_mtl_portals4.eq_h);
opal_output(ompi_mtl_base_output,
"%s:%d: nptlprocs != nprocs: %d\n",
__FILE__, __LINE__, ret);
return OMPI_ERR_NOT_SUPPORTED;
}
for (i = 0 ; i < nprocs ; ++i) {
mtl_peer_data[i] = malloc(sizeof(struct mca_mtl_base_endpoint_t));
if (NULL == mtl_peer_data[i]) {
PtlMEUnlink(ompi_mtl_portals4.long_overflow_me_h);
PtlMDRelease(ompi_mtl_portals4.zero_md_h);
PtlPTFree(ompi_mtl_portals4.ni_h, PTL_READ_TABLE_ID);
PtlPTFree(ompi_mtl_portals4.ni_h, PTL_SEND_TABLE_ID);
PtlEQFree(ompi_mtl_portals4.eq_h);
opal_output(ompi_mtl_base_output,
"%s:%d: malloc failed: %d\n",
__FILE__, __LINE__, ret);
return OMPI_ERROR;
}
mtl_peer_data[i]->ptl_proc.phys.nid = ptlprocs[i].nid;
mtl_peer_data[i]->ptl_proc.phys.pid = ptlprocs[i].pid;
}
return OMPI_SUCCESS;
@ -70,10 +207,18 @@ ompi_mtl_portals4_add_procs(struct mca_mtl_base_module_t *mtl,
int
ompi_mtl_portals4_del_procs(struct mca_mtl_base_module_t *mtl,
size_t nprocs,
struct ompi_proc_t** procs,
struct mca_mtl_base_endpoint_t **mtl_peer_data)
size_t nprocs,
struct ompi_proc_t** procs,
struct mca_mtl_base_endpoint_t **mtl_peer_data)
{
size_t i;
for (i = 0 ; i < nprocs ; ++i) {
if (NULL != mtl_peer_data[i]) {
free(mtl_peer_data[i]);
}
}
return OMPI_SUCCESS;
}
@ -81,8 +226,103 @@ ompi_mtl_portals4_del_procs(struct mca_mtl_base_module_t *mtl,
int
ompi_mtl_portals4_finalize(struct mca_mtl_base_module_t *mtl)
{
PtlNIFini(ompi_mtl_portals4.ptl_ni_h);
opal_progress_unregister(ompi_mtl_portals4_progress);
while (0 != ompi_mtl_portals4_progress()) { }
ompi_mtl_portals4_recv_short_fini(&ompi_mtl_portals4);
PtlMEUnlink(ompi_mtl_portals4.long_overflow_me_h);
PtlMDRelease(ompi_mtl_portals4.zero_md_h);
PtlEQFree(ompi_mtl_portals4.eq_h);
PtlPTFree(ompi_mtl_portals4.ni_h, PTL_READ_TABLE_ID);
PtlPTFree(ompi_mtl_portals4.ni_h, PTL_SEND_TABLE_ID);
PtlNIFini(ompi_mtl_portals4.ni_h);
PtlFini();
return OMPI_SUCCESS;
}
int
ompi_mtl_portals4_progress(void)
{
int count = 0, ret;
ptl_event_t ev;
ompi_mtl_portals4_request_t *ptl_request;
while (true) {
ret = PtlEQGet(ompi_mtl_portals4.eq_h, &ev);
if (PTL_OK == ret) {
OPAL_OUTPUT_VERBOSE((ompi_mtl_base_output, 50,
"Found event of type %d\n", ev.type));
switch (ev.type) {
case PTL_EVENT_GET:
case PTL_EVENT_PUT:
case PTL_EVENT_PUT_OVERFLOW:
case PTL_EVENT_ATOMIC:
case PTL_EVENT_ATOMIC_OVERFLOW:
if (NULL != ev.user_ptr) {
ptl_request = ev.user_ptr;
ret = ptl_request->event_callback(&ev, ptl_request);
if (OMPI_SUCCESS != ret) {
opal_output(ompi_mtl_base_output,
"Error returned from target event callback: %d", ret);
abort();
}
}
break;
case PTL_EVENT_REPLY:
case PTL_EVENT_SEND:
case PTL_EVENT_ACK:
if (NULL != ev.user_ptr) {
ptl_request = ev.user_ptr;
ret = ptl_request->event_callback(&ev, ptl_request);
if (OMPI_SUCCESS != ret) {
opal_output(ompi_mtl_base_output,
"Error returned from initiator event callback: %d", ret);
abort();
}
}
break;
case PTL_EVENT_DROPPED:
case PTL_EVENT_PT_DISABLED:
/* do stuff - flow control */
opal_output(ompi_mtl_base_output, "Unhandled flow control event.");
abort();
break;
case PTL_EVENT_AUTO_UNLINK:
break;
case PTL_EVENT_AUTO_FREE:
if (OMPI_SUCCESS != (ret = ompi_mtl_portals4_recv_short_block_repost(&ev))) {
opal_output(ompi_mtl_base_output,
"Error returned from PTL_EVENT_FREE callback: %d", ret);
abort();
}
break;
case PTL_EVENT_PROBE:
if (NULL != ev.user_ptr) {
ptl_request = ev.user_ptr;
ret = ptl_request->event_callback(&ev, ptl_request);
if (OMPI_SUCCESS != ret) {
opal_output(ompi_mtl_base_output,
"Error returned from target event callback: %d", ret);
abort();
}
}
break;
default:
opal_output(ompi_mtl_base_output,
"Unknown event type %d (error: %d)", (int)ev.type, ret);
abort();
}
} else if (PTL_EQ_EMPTY == ret) {
break;
} else {
opal_output(ompi_mtl_base_output,
"Error returned from PtlEQGet: %d", ret);
abort();
}
}
return count;
}

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

@ -1,5 +1,15 @@
/*
* Copyright (c) 2010 Sandia National Laboratories. All rights reserved.
* Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2007 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 (c) 2010 Sandia National Laboratories. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -7,20 +17,42 @@
* $HEADER$
*/
#ifndef MTL_PORTALS4_H
#define MTL_PORTALS4_H
#ifndef MTL_PORTALS_H_HAS_BEEN_INCLUDED
#define MTL_PORTALS_H_HAS_BEEN_INCLUDED
#include <portals4.h>
#include "ompi_config.h"
#include "opal/class/opal_list.h"
#include "ompi/class/ompi_free_list.h"
#include "ompi/mca/mtl/mtl.h"
#include "ompi/mca/mtl/base/base.h"
#include "opal/datatype/opal_convertor.h"
#include "mtl_portals4_endpoint.h"
#include "mtl_portals4_request.h"
BEGIN_C_DECLS
struct mca_mtl_portals4_module_t {
mca_mtl_base_module_t base;
ptl_handle_ni_t ptl_ni_h;
mca_mtl_base_endpoint_t *endpoints;
/* configuration */
size_t eager_limit;
size_t recv_short_size;
int recv_short_num;
int queue_size;
/* global handles */
ptl_handle_ni_t ni_h;
ptl_handle_eq_t eq_h;
/* for zero-length sends and acks */
ptl_handle_md_t zero_md_h;
/* long message receive overflow */
ptl_handle_me_t long_overflow_me_h;
ompi_mtl_portals4_request_t long_overflow_request;
opal_list_t recv_short_blocks;
};
typedef struct mca_mtl_portals4_module_t mca_mtl_portals4_module_t;
@ -28,6 +60,9 @@ extern mca_mtl_portals4_module_t ompi_mtl_portals4;
OMPI_DECLSPEC extern mca_mtl_base_component_2_0_0_t mca_mtl_portals4_component;
#define PTL_SEND_TABLE_ID 2
#define PTL_READ_TABLE_ID 4
/* match/ignore bit manipulation
*
@ -37,6 +72,7 @@ OMPI_DECLSPEC extern mca_mtl_base_component_2_0_0_t mca_mtl_portals4_component;
* | | | |
* +---- protocol
*/
#define PTL_PROTOCOL_MASK 0xF000000000000000ULL
#define PTL_CONTEXT_MASK 0x0FFF000000000000ULL
#define PTL_SOURCE_MASK 0x0000FFFF00000000ULL
@ -53,37 +89,37 @@ OMPI_DECLSPEC extern mca_mtl_base_component_2_0_0_t mca_mtl_portals4_component;
/* send posting */
#define PTL_SET_SEND_BITS(match_bits, contextid, source, tag, type) \
{ \
match_bits = contextid; \
match_bits = (match_bits << 16); \
match_bits |= source; \
match_bits = (match_bits << 32); \
match_bits |= (PTL_TAG_MASK & tag) | type; \
}
{ \
match_bits = contextid; \
match_bits = (match_bits << 16); \
match_bits |= source; \
match_bits = (match_bits << 32); \
match_bits |= (PTL_TAG_MASK & tag) | type; \
}
/* receive posting */
#define PTL_SET_RECV_BITS(match_bits, ignore_bits, contextid, source, tag) \
{ \
match_bits = 0; \
ignore_bits = PTL_PROTOCOL_IGNR; \
\
match_bits = contextid; \
match_bits = (match_bits << 16); \
\
if (MPI_ANY_SOURCE == source) { \
match_bits = (match_bits << 32); \
ignore_bits |= PTL_SOURCE_IGNR; \
} else { \
match_bits |= source; \
match_bits = (match_bits << 32); \
} \
\
if (MPI_ANY_TAG == tag) { \
ignore_bits |= PTL_TAG_IGNR; \
} else { \
match_bits |= (PTL_TAG_MASK & tag); \
} \
}
{ \
match_bits = 0; \
ignore_bits = PTL_PROTOCOL_IGNR; \
\
match_bits = contextid; \
match_bits = (match_bits << 16); \
\
if (MPI_ANY_SOURCE == source) { \
match_bits = (match_bits << 32); \
ignore_bits |= PTL_SOURCE_IGNR; \
} else { \
match_bits |= source; \
match_bits = (match_bits << 32); \
} \
\
if (MPI_ANY_TAG == tag) { \
ignore_bits |= PTL_TAG_IGNR; \
} else { \
match_bits |= (PTL_TAG_MASK & tag); \
} \
}
#define PTL_IS_SHORT_MSG(match_bits) \
(0 != (PTL_SHORT_MSG & match_bits))
@ -91,8 +127,8 @@ OMPI_DECLSPEC extern mca_mtl_base_component_2_0_0_t mca_mtl_portals4_component;
(0 != (PTL_LONG_MSG & match_bits))
#define PTL_IS_READY_MSG(match_bits) \
(0 != (PTL_READY_MSG & match_bits))
#define PTL_IS_SYNC_MSG(event) \
(0 != event.hdr_data)
#define PTL_IS_SYNC_MSG(ev) \
(0 != ev->hdr_data)
#define PTL_GET_TAG(match_bits) ((int)(match_bits & PTL_TAG_MASK))
#define PTL_GET_SOURCE(match_bits) ((int)((match_bits & PTL_SOURCE_MASK) >> 32))
@ -110,13 +146,6 @@ extern int ompi_mtl_portals4_del_procs(struct mca_mtl_base_module_t* mtl,
struct ompi_proc_t** procs,
struct mca_mtl_base_endpoint_t **mtl_peer_data);
extern int ompi_mtl_portals4_send(struct mca_mtl_base_module_t* mtl,
struct ompi_communicator_t* comm,
int dest,
int tag,
struct opal_convertor_t *convertor,
mca_pml_base_send_mode_t mode);
extern int ompi_mtl_portals4_isend(struct mca_mtl_base_module_t* mtl,
struct ompi_communicator_t* comm,
int dest,
@ -144,6 +173,10 @@ extern int ompi_mtl_portals4_cancel(struct mca_mtl_base_module_t* mtl,
mca_mtl_request_t *mtl_request,
int flag);
extern int ompi_mtl_portals4_progress(void);
extern int ompi_mtl_portals4_get_error(int ptl_error);
END_C_DECLS
#endif /* MTL_PORTALS4_H_HAS_BEEN_INCLUDED */
#endif /* MTL_PORTALS_H_HAS_BEEN_INCLUDED */

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

@ -1,5 +1,15 @@
/*
* Copyright (c) 2010 Sandia National Laboratories. All rights reserved.
* Copyright (c) 2004-2007 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 (c) 2010 Sandia National Laboratories. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -9,34 +19,43 @@
#include "ompi_config.h"
#include "opal/mca/event/event.h"
#include "opal/util/output.h"
#include "opal/mca/base/mca_base_param.h"
#include "mtl_portals4.h"
#include "mtl_portals4_request.h"
static int ompi_mtl_portals4_component_open(void);
static int ompi_mtl_portals4_component_close(void);
static mca_mtl_base_module_t* ompi_mtl_portals4_component_init(bool enable_progress_threads,
bool enable_mpi_threads);
static mca_mtl_base_module_t* ompi_mtl_portals4_component_init(
bool enable_progress_threads, bool enable_mpi_threads);
mca_mtl_base_component_2_0_0_t mca_mtl_portals4_component = {
{
MCA_MTL_BASE_VERSION_2_0_0,
"portals4", /* MCA component name */
OMPI_MAJOR_VERSION, /* MCA component major version */
OMPI_MINOR_VERSION, /* MCA component minor version */
OMPI_RELEASE_VERSION, /* MCA component release version */
ompi_mtl_portals4_component_open, /* component open */
ompi_mtl_portals4_component_close /* component close */
},
{
/* The component is not checkpoint ready */
MCA_BASE_METADATA_PARAM_NONE
},
ompi_mtl_portals4_component_init, /* component init */
/* First, the mca_base_component_t struct containing meta
* information about the component itself */
{
MCA_MTL_BASE_VERSION_2_0_0,
"portals4", /* MCA component name */
OMPI_MAJOR_VERSION, /* MCA component major version */
OMPI_MINOR_VERSION, /* MCA component minor version */
OMPI_RELEASE_VERSION, /* MCA component release version */
ompi_mtl_portals4_component_open, /* component open */
ompi_mtl_portals4_component_close /* component close */
},
{
/* The component is not checkpoint ready */
MCA_BASE_METADATA_PARAM_NONE
},
ompi_mtl_portals4_component_init, /* component init */
};
static int
ompi_mtl_portals4_component_open(void)
{
@ -46,9 +65,43 @@ ompi_mtl_portals4_component_open(void)
sizeof(ompi_mtl_portals4_request_t) -
sizeof(struct mca_mtl_request_t);
ompi_mtl_portals4.ptl_ni_h = PTL_INVALID_HANDLE;
mca_base_param_reg_int(&mca_mtl_portals4_component.mtl_version,
"eager_limit",
"Cross-over point from eager to rendezvous sends",
false,
false,
32 * 1024,
&tmp);
ompi_mtl_portals4.eager_limit = tmp;
return OMPI_SUCCESS;
mca_base_param_reg_int(&mca_mtl_portals4_component.mtl_version,
"short_recv_num",
"Number of short message receive blocks",
false,
false,
8,
&ompi_mtl_portals4.recv_short_num);
mca_base_param_reg_int(&mca_mtl_portals4_component.mtl_version,
"short_recv_size",
"Size of short message receive blocks",
false,
false,
1024 * 1024,
&tmp);
ompi_mtl_portals4.recv_short_size = tmp;
mca_base_param_reg_int(&mca_mtl_portals4_component.mtl_version,
"queue_size",
"Size of the event queue in entries",
false,
false,
1024,
&ompi_mtl_portals4.queue_size);
ompi_mtl_portals4.ni_h = PTL_INVALID_HANDLE;
return ompi_mtl_portals4_get_error(PtlInit());
}
@ -63,15 +116,82 @@ static mca_mtl_base_module_t*
ompi_mtl_portals4_component_init(bool enable_progress_threads,
bool enable_mpi_threads)
{
if (PTL_OK != PtlInit()) {
return NULL;
}
if (PTL_OK != PtlNIInit(PTL_IFACE_DEFAULT, PTL_NI_MATCHING|PTL_NI_PHYSICAL,
PTL_PID_ANY, NULL, NULL, 0, NULL, NULL,
&ompi_mtl_portals4.ptl_ni_h)) {
if (PTL_OK != PtlNIInit(PTL_IFACE_DEFAULT,
PTL_NI_PHYSICAL | PTL_NI_MATCHING,
PTL_PID_ANY,
NULL,
NULL,
0,
NULL,
NULL,
&ompi_mtl_portals4.ni_h)) {
return NULL;
}
return &ompi_mtl_portals4.base;
}
int
ompi_mtl_portals4_get_error(int ptl_error)
{
int ret;
switch (ptl_error) {
case PTL_OK:
ret = OMPI_SUCCESS;
break;
case PTL_ARG_INVALID:
ret = OMPI_ERR_BAD_PARAM;
break;
case PTL_CT_NONE_REACHED:
ret = OMPI_ERR_TIMEOUT;
break;
case PTL_EQ_DROPPED:
ret = OMPI_ERR_OUT_OF_RESOURCE;
break;
case PTL_EQ_EMPTY:
ret = OMPI_ERR_TEMP_OUT_OF_RESOURCE;
break;
case PTL_FAIL:
ret = OMPI_ERROR;
break;
case PTL_IN_USE:
ret = OMPI_ERR_RESOURCE_BUSY;
break;
case PTL_INTERRUPTED:
ret = OMPI_ERR_RESOURCE_BUSY;
break;
case PTL_LIST_TOO_LONG:
ret = OMPI_ERR_OUT_OF_RESOURCE;
break;
case PTL_NI_NOT_LOGICAL:
ret = OMPI_ERR_FATAL;
break;
case PTL_NO_INIT:
ret = OMPI_ERR_FATAL;
break;
case PTL_NO_SPACE:
ret = OMPI_ERR_OUT_OF_RESOURCE;
break;
case PTL_PID_IN_USE:
ret = OMPI_ERR_BAD_PARAM;
break;
case PTL_PT_FULL:
ret = OMPI_ERR_OUT_OF_RESOURCE;
break;
case PTL_PT_EQ_NEEDED:
ret = OMPI_ERR_FATAL;
break;
case PTL_PT_IN_USE:
ret = OMPI_ERR_RESOURCE_BUSY;
break;
case PTL_SIZE_INVALID:
ret = OMPI_ERR_BAD_PARAM;
break;
default:
ret = OMPI_ERROR;
}
return ret;
}

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

@ -1,5 +1,15 @@
/*
* Copyright (c) 2010 Sandia National Laboratories. All rights reserved.
* Copyright (c) 2004-2006 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 (c) 2010 Sandia National Laboratories. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -7,10 +17,8 @@
* $HEADER$
*/
#ifndef OMPI_MTL_PORTALS4_ENDPOINT_H
#define OMPI_MTL_PORTALS4_ENDPOINT_H
#include <portals4.h>
#ifndef OMPI_MTL_PORTALS_ENDPOINT_H
#define OMPI_MTL_PORTALS_ENDPOINT_H
struct mca_mtl_base_endpoint_t {
ptl_process_t ptl_proc;

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

@ -1,5 +1,15 @@
/*
* Copyright (c) 2010 Sandia National Laboratories. All rights reserved.
* Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2010 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 (c) 2010 Sandia National Laboratories. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -8,8 +18,9 @@
*/
#include "ompi_config.h"
#include "ompi/communicator/communicator.h"
#include "mtl_portals4.h"
#include "mtl_portals4_request.h"
int
ompi_mtl_portals4_iprobe(struct mca_mtl_base_module_t* mtl,
@ -19,5 +30,9 @@ ompi_mtl_portals4_iprobe(struct mca_mtl_base_module_t* mtl,
int *flag,
struct ompi_status_public_t *status)
{
return OMPI_SUCCESS;
/* BWB: FIX ME: implement */
opal_output(ompi_mtl_base_output,
"%s:%d: iprobe failed: not implemented\n",
__FILE__, __LINE__);
return OMPI_ERR_NOT_IMPLEMENTED;
}

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

@ -1,5 +1,15 @@
/*
* Copyright (c) 2010 Sandia National Laboratories. All rights reserved.
* Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2010 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 (c) 2010 Sandia National Laboratories. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -7,9 +17,226 @@
* $HEADER$
*/
#include "ompi_config.h"
#include "opal/class/opal_list.h"
#include "ompi/communicator/communicator.h"
#include "ompi/datatype/ompi_datatype.h"
#include "opal/datatype/opal_convertor.h"
#include "ompi/mca/mtl/base/base.h"
#include "ompi/mca/mtl/base/mtl_base_datatype.h"
#include "mtl_portals4.h"
#include "mtl_portals4_endpoint.h"
#include "mtl_portals4_request.h"
#include "mtl_portals4_recv_short.h"
/* called when a receive should be progressed */
int
ompi_mtl_portals4_recv_progress(ptl_event_t *ev,
ompi_mtl_portals4_request_t* ptl_request)
{
int ret;
switch (ev->type) {
case PTL_EVENT_PUT:
if (ev->ni_fail_type == PTL_NI_OK) {
/* make sure the data is in the right place */
ret = ompi_mtl_datatype_unpack(ptl_request->convertor,
ev->start,
ev->mlength);
if (OMPI_SUCCESS != ret) {
opal_output_verbose(ompi_mtl_base_output, 1,
"%s:%d: ompi_mtl_datatype_unpack failed: %d",
__FILE__, __LINE__, ret);
ptl_request->super.ompi_req->req_status.MPI_ERROR = ret;
}
/* set the status */
ptl_request->super.ompi_req->req_status.MPI_SOURCE =
PTL_GET_SOURCE(ev->match_bits);
ptl_request->super.ompi_req->req_status.MPI_TAG =
PTL_GET_TAG(ev->match_bits);
if (ev->rlength > ev->mlength) {
ptl_request->super.ompi_req->req_status.MPI_ERROR = MPI_ERR_TRUNCATE;
}
ptl_request->super.ompi_req->req_status._ucount =
ev->mlength;
} else {
opal_output_verbose(ompi_mtl_base_output, 1,
"%s:%d: recv(PTL_EVENT_PUT) ni_fail_type: %d",
__FILE__, __LINE__, ret);
ptl_request->super.ompi_req->req_status.MPI_ERROR = OMPI_ERROR;
}
ptl_request->super.completion_callback(&ptl_request->super);
break;
case PTL_EVENT_REPLY:
if (ev->ni_fail_type == PTL_NI_OK) {
/* make sure the data is in the right place */
ret = ompi_mtl_datatype_unpack(ptl_request->convertor,
ev->start,
ev->mlength);
if (OMPI_SUCCESS != ret) {
opal_output_verbose(ompi_mtl_base_output, 1,
"%s:%d: ompi_mtl_datatype_unpack failed: %d",
__FILE__, __LINE__, ret);
ptl_request->super.ompi_req->req_status.MPI_ERROR = ret;
}
/* set the status - most of this filled in right after issuing
the PtlGet */
ptl_request->super.ompi_req->req_status._ucount =
ev->mlength;
} else {
opal_output_verbose(ompi_mtl_base_output, 1,
"%s:%d: recv(PTL_EVENT_REPLY) ni_fail_type: %d",
__FILE__, __LINE__, ret);
ptl_request->super.ompi_req->req_status.MPI_ERROR = OMPI_ERROR;
}
PtlMDRelease(ptl_request->md_h);
ptl_request->super.completion_callback(&ptl_request->super);
break;
case PTL_EVENT_PUT_OVERFLOW:
/* overflow case. Short messages have the buffer stashed
somewhere. Long messages left in buffer at the source */
if (PTL_IS_SHORT_MSG(ev->match_bits)) {
if (ev->ni_fail_type == PTL_NI_OK) {
ptl_request->super.ompi_req->req_status.MPI_SOURCE =
PTL_GET_SOURCE(ev->match_bits);
ptl_request->super.ompi_req->req_status.MPI_TAG =
PTL_GET_TAG(ev->match_bits);
if (ev->rlength > ptl_request->delivery_len) {
ptl_request->super.ompi_req->req_status.MPI_ERROR = MPI_ERR_TRUNCATE;
}
ptl_request->super.ompi_req->req_status._ucount =
ev->mlength;
if (ev->mlength > 0) {
struct iovec iov;
uint32_t iov_count = 1;
size_t max_data;
iov.iov_base = (char*) ev->start;
iov.iov_len = ev->mlength;
max_data = iov.iov_len;
ret = opal_convertor_unpack(ptl_request->convertor,
&iov, &iov_count,
&max_data );
if (OMPI_SUCCESS != ret) {
opal_output_verbose(ompi_mtl_base_output, 1,
"%s:%d: opal_convertor_unpack failed: %d",
__FILE__, __LINE__, ret);
if (NULL != ptl_request->buffer_ptr) free(ptl_request->buffer_ptr);
ptl_request->super.ompi_req->req_status.MPI_ERROR = ret;
ptl_request->super.completion_callback(&ptl_request->super);
return OMPI_SUCCESS;
}
}
if (NULL != ptl_request->buffer_ptr) free(ptl_request->buffer_ptr);
/* if it's a sync, send the ack */
if (PTL_IS_SYNC_MSG(ev)) {
ret = PtlPut(ompi_mtl_portals4.zero_md_h,
0,
0,
PTL_NO_ACK_REQ,
ev->initiator,
PTL_READ_TABLE_ID,
ev->hdr_data,
0,
NULL,
0);
if (PTL_OK != ret) {
opal_output_verbose(ompi_mtl_base_output, 1,
"%s:%d: PtlPut failed: %d",
__FILE__, __LINE__, ret);
ptl_request->super.ompi_req->req_status.MPI_ERROR =
ompi_mtl_portals4_get_error(ret);;
ptl_request->super.completion_callback(&ptl_request->super);
return OMPI_SUCCESS;
}
}
} else {
opal_output_verbose(ompi_mtl_base_output, 1,
"%s:%d: recv(PTL_EVENT_PUT_OVERFLOW) ni_fail_type: %d",
__FILE__, __LINE__, ret);
ptl_request->super.ompi_req->req_status.MPI_ERROR = OMPI_ERROR;
}
ptl_request->super.completion_callback(&ptl_request->super);
} else {
ptl_md_t md;
if (ev->ni_fail_type == PTL_NI_OK) {
/* set the status */
ptl_request->super.ompi_req->req_status.MPI_SOURCE =
PTL_GET_SOURCE(ev->match_bits);
ptl_request->super.ompi_req->req_status.MPI_TAG =
PTL_GET_TAG(ev->match_bits);
if (ev->rlength > ptl_request->delivery_len) {
ptl_request->super.ompi_req->req_status.MPI_ERROR = MPI_ERR_TRUNCATE;
}
md.start = ptl_request->delivery_ptr;
md.length = (ev->rlength > ptl_request->delivery_len) ?
ptl_request->delivery_len : ev->rlength;
md.options = 0;
md.eq_handle = ompi_mtl_portals4.eq_h;
md.ct_handle = PTL_CT_NONE;
ret = PtlMDBind(ompi_mtl_portals4.ni_h,
&md,
&ptl_request->md_h);
if (PTL_OK != ret) {
if (NULL != ptl_request->buffer_ptr) free(ptl_request->buffer_ptr);
opal_output_verbose(ompi_mtl_base_output, 1,
"%s:%d: PtlMDBind failed: %d",
__FILE__, __LINE__, ret);
ptl_request->super.ompi_req->req_status.MPI_ERROR =
ompi_mtl_portals4_get_error(ret);;
ptl_request->super.completion_callback(&ptl_request->super);
return OMPI_SUCCESS;
}
ret = PtlGet(ompi_mtl_portals4.ni_h,
0,
md.length,
ev->initiator,
PTL_READ_TABLE_ID,
ev->hdr_data,
ptl_request,
0);
if (PTL_OK != ret) {
PtlMDRelease(ptl_request->md_h);
if (NULL != ptl_request->buffer_ptr) free(ptl_request->buffer_ptr);
opal_output_verbose(ompi_mtl_base_output, 1,
"%s:%d: PtlGet failed: %d",
__FILE__, __LINE__, ret);
ptl_request->super.ompi_req->req_status.MPI_ERROR =
ompi_mtl_portals4_get_error(ret);;
ptl_request->super.completion_callback(&ptl_request->super);
return OMPI_SUCCESS;
}
} else {
opal_output_verbose(ompi_mtl_base_output, 1,
"%s:%d: recv(PTL_EVENT_PUT_OVERFLOW) ni_fail_type: %d",
__FILE__, __LINE__, ret);
ptl_request->super.ompi_req->req_status.MPI_ERROR = OMPI_ERROR;
ptl_request->super.completion_callback(&ptl_request->super);
}
}
break;
default:
opal_output(ompi_mtl_base_output,
"Unhandled receive callback with event type %d",
ev->type);
return OMPI_ERROR;
}
return OMPI_SUCCESS;
}
int
ompi_mtl_portals4_irecv(struct mca_mtl_base_module_t* mtl,
@ -19,6 +246,67 @@ ompi_mtl_portals4_irecv(struct mca_mtl_base_module_t* mtl,
struct opal_convertor_t *convertor,
mca_mtl_request_t *mtl_request)
{
return OMPI_SUCCESS;
}
ptl_match_bits_t match_bits, ignore_bits;
int ret = OMPI_SUCCESS;
ptl_process_t remote_proc;
mca_mtl_base_endpoint_t *endpoint = NULL;
ompi_mtl_portals4_request_t *ptl_request =
(ompi_mtl_portals4_request_t*) mtl_request;
void *start;
size_t length;
bool free_after;
ptl_me_t me;
if (MPI_ANY_SOURCE == src) {
remote_proc.phys.nid = PTL_NID_ANY;
remote_proc.phys.pid = PTL_PID_ANY;
} else {
ompi_proc_t* ompi_proc = ompi_comm_peer_lookup( comm, src );
endpoint = (mca_mtl_base_endpoint_t*) ompi_proc->proc_pml;
remote_proc = endpoint->ptl_proc;
}
PTL_SET_RECV_BITS(match_bits, ignore_bits, comm->c_contextid,
src, tag);
ret = ompi_mtl_datatype_recv_buf(convertor, &start, &length, &free_after);
if (OMPI_SUCCESS != ret) {
opal_output_verbose(ompi_mtl_base_output, 1,
"%s:%d: PtlMEAppend failed: %d",
__FILE__, __LINE__, ret);
return ret;
}
ptl_request->event_callback = ompi_mtl_portals4_recv_progress;
ptl_request->buffer_ptr = (free_after) ? start : NULL;
ptl_request->convertor = convertor;
ptl_request->delivery_ptr = start;
ptl_request->delivery_len = length;
ptl_request->super.ompi_req->req_status.MPI_ERROR = OMPI_SUCCESS;
me.start = start;
me.length = length;
me.ct_handle = PTL_CT_NONE;
me.min_free = 0;
me.ac_id.uid = PTL_UID_ANY;
me.options = PTL_ME_OP_PUT | PTL_ME_USE_ONCE | PTL_ME_EVENT_UNLINK_DISABLE;
me.match_id = remote_proc;
me.match_bits = match_bits;
me.ignore_bits = ignore_bits;
ret = PtlMEAppend(ompi_mtl_portals4.ni_h,
PTL_SEND_TABLE_ID,
&me,
PTL_PRIORITY_LIST,
ptl_request,
&ptl_request->me_h);
if (PTL_OK != ret) {
if (NULL != ptl_request->buffer_ptr) free(ptl_request->buffer_ptr);
opal_output_verbose(ompi_mtl_base_output, 1,
"%s:%d: PtlMEAppend failed: %d",
__FILE__, __LINE__, ret);
return ompi_mtl_portals4_get_error(ret);
}
return OMPI_SUCCESS;
}

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

@ -0,0 +1,142 @@
/*
* 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 (c) 2010 Sandia National Laboratories. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include "ompi_config.h"
#include "ompi/constants.h"
#include "mtl_portals4.h"
#include "mtl_portals4_recv_short.h"
OBJ_CLASS_INSTANCE(ompi_mtl_portals4_recv_short_block_t,
opal_list_item_t,
NULL, NULL);
static ompi_mtl_portals4_recv_short_block_t*
ompi_mtl_portals4_recv_short_block_init(mca_mtl_portals4_module_t *mtl)
{
ompi_mtl_portals4_recv_short_block_t *block;
block = OBJ_NEW(ompi_mtl_portals4_recv_short_block_t);
block->mtl = mtl;
block->start = malloc(mtl->recv_short_size);
if (block->start == NULL) return NULL;
block->me_h = PTL_INVALID_HANDLE;
return block;
}
static int
ompi_mtl_portals4_recv_short_block_free(ompi_mtl_portals4_recv_short_block_t *block)
{
if (PTL_INVALID_HANDLE != block->me_h) {
PtlMEUnlink(block->me_h);
block->me_h = PTL_INVALID_HANDLE;
}
if (NULL != block->start) {
free(block->start);
block->start = NULL;
}
OBJ_RELEASE(block);
return OMPI_SUCCESS;
}
static inline int
ompi_mtl_portals4_activate_block(ompi_mtl_portals4_recv_short_block_t *block)
{
ptl_match_bits_t match_bits = PTL_SHORT_MSG;
ptl_match_bits_t ignore_bits = PTL_CONTEXT_MASK | PTL_SOURCE_MASK | PTL_TAG_MASK;
ptl_me_t me;
int ret;
me.start = block->start;
me.length = block->mtl->recv_short_size;
me.ct_handle = PTL_CT_NONE;
me.min_free = block->mtl->eager_limit;
me.ac_id.uid = PTL_UID_ANY;
me.options = PTL_ME_OP_PUT | PTL_ME_MANAGE_LOCAL | PTL_ME_NO_TRUNCATE |
PTL_ME_MAY_ALIGN | PTL_ME_ACK_DISABLE | PTL_ME_EVENT_COMM_DISABLE;
me.match_id.phys.nid = PTL_NID_ANY;
me.match_id.phys.pid = PTL_PID_ANY;
me.match_bits = match_bits;
me.ignore_bits = ignore_bits;
ret = PtlMEAppend(block->mtl->ni_h,
PTL_SEND_TABLE_ID,
&me,
PTL_OVERFLOW,
block,
&block->me_h);
return (ret == PTL_OK) ? OMPI_SUCCESS : ompi_mtl_portals4_get_error(ret);
}
int
ompi_mtl_portals4_recv_short_block_repost(ptl_event_t *ev)
{
return ompi_mtl_portals4_activate_block(ev->user_ptr);
}
int
ompi_mtl_portals4_recv_short_init(mca_mtl_portals4_module_t *mtl)
{
int i;
OBJ_CONSTRUCT(&(mtl->recv_short_blocks), opal_list_t);
/* create the recv blocks */
for (i = 0 ; i < mtl->recv_short_num ; ++i) {
ompi_mtl_portals4_recv_short_block_t *block =
ompi_mtl_portals4_recv_short_block_init(mtl);
if (NULL == block) {
return OMPI_ERR_OUT_OF_RESOURCE;
}
opal_list_append(&(mtl->recv_short_blocks),
(opal_list_item_t*) block);
ompi_mtl_portals4_activate_block(block);
}
return OMPI_SUCCESS;
}
int
ompi_mtl_portals4_recv_short_fini(mca_mtl_portals4_module_t *mtl)
{
opal_list_item_t *item;
while (NULL != (item = opal_list_remove_first(&mtl->recv_short_blocks))) {
ompi_mtl_portals4_recv_short_block_t *block =
(ompi_mtl_portals4_recv_short_block_t*) item;
ompi_mtl_portals4_recv_short_block_free(block);
}
return OMPI_SUCCESS;
}

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

@ -0,0 +1,45 @@
/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2006 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 (c) 2010 Sandia National Laboratories. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#ifndef OMPI_MTL_PORTALS_RECV_SHORT_H
#define OMPI_MTL_PORTALS_RECV_SHORT_H
struct ompi_mtl_portals4_recv_short_block_t {
opal_list_item_t base;
mca_mtl_portals4_module_t *mtl;
void *start;
ptl_handle_me_t me_h;
};
typedef struct ompi_mtl_portals4_recv_short_block_t ompi_mtl_portals4_recv_short_block_t;
OBJ_CLASS_DECLARATION(ompi_mtl_portals4_recv_short_block_t);
extern int
ompi_mtl_portals4_recv_short_init(mca_mtl_portals4_module_t *mtl);
extern int
ompi_mtl_portals4_recv_short_fini(mca_mtl_portals4_module_t *mtl);
extern int
ompi_mtl_portals4_recv_short_block_repost(ptl_event_t *ev);
extern int
ompi_mtl_portals4_recv_progress(ptl_event_t *ev,
ompi_mtl_portals4_request_t* ptl_request);
#endif /* OMPI_MTL_PORTALS_RECV_SHORT_H */

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

@ -1,5 +1,15 @@
/*
* Copyright (c) 2010 Sandia National Laboratories. All rights reserved.
* Copyright (c) 2004-2006 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 (c) 2010 Sandia National Laboratories. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -7,13 +17,22 @@
* $HEADER$
*/
#ifndef OMPI_MTL_PORTALS4_REQUEST_H
#define OMPI_MTL_PORTALS4_REQUEST_H
#ifndef OMPI_MTL_PORTALS_REQUEST_H
#define OMPI_MTL_PORTALS_REQUEST_H
#include "opal/datatype/opal_convertor.h"
#include "ompi/mca/mtl/mtl.h"
struct ompi_mtl_portals4_request_t {
struct mca_mtl_request_t super;
int (*event_callback)(ptl_event_t *ev, struct ompi_mtl_portals4_request_t*);
void *buffer_ptr; /* send and receive side */
ptl_handle_md_t md_h; /* send and receive side */
ptl_handle_me_t me_h; /* send and receive side */
int event_count; /* send side */
struct opal_convertor_t *convertor; /* recv side */
void *delivery_ptr; /* recv side */
size_t delivery_len; /* recv side */
};
typedef struct ompi_mtl_portals4_request_t ompi_mtl_portals4_request_t;

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

@ -1,5 +1,15 @@
/*
* Copyright (c) 2010 Sandia National Laboratories. All rights reserved.
* Copyright (c) 2004-2006 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 (c) 2010 Sandia National Laboratories. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
@ -9,21 +19,312 @@
#include "ompi_config.h"
#include "ompi/communicator/communicator.h"
#include "opal/datatype/opal_convertor.h"
#include "ompi/mca/mtl/base/base.h"
#include "ompi/mca/mtl/base/mtl_base_datatype.h"
#include "mtl_portals4.h"
#include "mtl_portals4_request.h"
#include "mtl_portals4_endpoint.h"
int
ompi_mtl_portals4_send(struct mca_mtl_base_module_t* mtl,
struct ompi_communicator_t* comm,
int dest,
int tag,
struct opal_convertor_t *convertor,
mca_pml_base_send_mode_t mode)
/* called when no ack is necessary */
static int
ompi_mtl_portals4_short_callback(ptl_event_t *ev, ompi_mtl_portals4_request_t *ptl_request)
{
assert(ev->type == PTL_EVENT_SEND);
assert(NULL != ptl_request->super.ompi_req);
if (ev->ni_fail_type != PTL_NI_OK) {
opal_output_verbose(ompi_mtl_base_output, 1,
"%s:%d: short send callback ni_fail_type: %d",
__FILE__, __LINE__, ev->ni_fail_type);
ptl_request->super.ompi_req->req_status.MPI_ERROR = OMPI_ERROR;
}
if (NULL != ptl_request->buffer_ptr) {
free(ptl_request->buffer_ptr);
}
PtlMDRelease(ptl_request->md_h);
ptl_request->super.completion_callback(&ptl_request->super);
return OMPI_SUCCESS;
}
/* called when send should wait for an ack or get */
static int
ompi_mtl_portals4_long_callback(ptl_event_t *ev, struct ompi_mtl_portals4_request_t* ptl_request)
{
assert(ev->type == PTL_EVENT_SEND || ev->type == PTL_EVENT_ACK || ev->type == PTL_EVENT_GET);
assert(NULL != ptl_request->super.ompi_req);
if (ev->ni_fail_type != PTL_NI_OK) {
opal_output_verbose(ompi_mtl_base_output, 1,
"%s:%d: long send callback ni_fail_type: %d",
__FILE__, __LINE__, ev->ni_fail_type);
ptl_request->super.ompi_req->req_status.MPI_ERROR = OMPI_ERROR;
}
/* we only receive an ack if the message was received into an
expected message. Otherwise, we don't get an ack, but mark
completion when the message was pulled (long message). */
if ( ++(ptl_request->event_count) == 2 ) {
if (NULL != ptl_request->buffer_ptr) {
free(ptl_request->buffer_ptr);
}
PtlMDRelease(ptl_request->md_h);
ptl_request->super.completion_callback(&ptl_request->super);
}
/* received an ack - unlink the me */
if (ev->type == PTL_EVENT_ACK) {
PtlMEUnlink(ptl_request->me_h);
}
return OMPI_SUCCESS;
}
/* called when sync send should wait for an ack or put */
static int
ompi_mtl_portals4_sync_callback(ptl_event_t *ev, struct ompi_mtl_portals4_request_t* ptl_request)
{
assert(ev->type == PTL_EVENT_SEND || ev->type == PTL_EVENT_ACK || ev->type == PTL_EVENT_PUT);
assert(NULL != ptl_request->super.ompi_req);
if (ev->ni_fail_type != PTL_NI_OK) {
opal_output_verbose(ompi_mtl_base_output, 1,
"%s:%d: sync send callback ni_fail_type: %d",
__FILE__, __LINE__, ev->ni_fail_type);
ptl_request->super.ompi_req->req_status.MPI_ERROR = OMPI_ERROR;
}
/* we only receive an ack if the message was received into an
expected message. Otherwise, we don't get an ack, but mark
completion when a zero-length put arrrives. */
if ( ++(ptl_request->event_count) == 2 ) {
if (NULL != ptl_request->buffer_ptr) {
free(ptl_request->buffer_ptr);
}
PtlMDRelease(ptl_request->md_h);
ptl_request->super.completion_callback(&ptl_request->super);
}
/* received an ack - unlink the me */
if (ev->type == PTL_EVENT_ACK) {
PtlMEUnlink(ptl_request->me_h);
}
return OMPI_SUCCESS;
}
static int
ompi_mtl_portals4_short_isend(mca_pml_base_send_mode_t mode, void *start, int length,
int contextid, int localrank, int tag, ptl_process_t dest,
ompi_mtl_portals4_request_t *ptl_request )
{
int ret;
ptl_match_bits_t mode_bits;
ptl_match_bits_t match_bits;
ptl_md_t md;
ptl_request->event_callback = ompi_mtl_portals4_short_callback;
mode_bits = (MCA_PML_BASE_SEND_READY != mode) ? PTL_SHORT_MSG : PTL_READY_MSG;
PTL_SET_SEND_BITS(match_bits, contextid, localrank, tag, mode_bits);
md.start = start;
md.length = length;
md.options = 0;
md.eq_handle = ompi_mtl_portals4.eq_h;
md.ct_handle = PTL_CT_NONE;
ret = PtlMDBind(ompi_mtl_portals4.ni_h,
&md,
&ptl_request->md_h);
if (PTL_OK != ret) {
opal_output_verbose(ompi_mtl_base_output, 1,
"%s:%d: PtlMDBind failed: %d",
__FILE__, __LINE__, ret);
return ompi_mtl_portals4_get_error(ret);
}
ret = PtlPut(ptl_request->md_h,
0,
length,
PTL_NO_ACK_REQ,
dest,
PTL_SEND_TABLE_ID,
match_bits,
0,
ptl_request,
0);
if (PTL_OK != ret) {
opal_output_verbose(ompi_mtl_base_output, 1,
"%s:%d: PtlPut failed: %d",
__FILE__, __LINE__, ret);
PtlMDRelease(ptl_request->md_h);
return ompi_mtl_portals4_get_error(ret);
}
return OMPI_SUCCESS;
}
static int
ompi_mtl_portals4_long_isend( void *start, int length, int contextid, int localrank, int tag,
ptl_process_t dest, ompi_mtl_portals4_request_t *ptl_request )
{
int ret;
ptl_match_bits_t match_bits;
ptl_md_t md;
ptl_me_t me;
ptl_request->event_callback = ompi_mtl_portals4_long_callback;
PTL_SET_SEND_BITS(match_bits, contextid, localrank, tag, PTL_LONG_MSG);
md.start = start;
md.length = length;
md.options = 0;
md.eq_handle = ompi_mtl_portals4.eq_h;
md.ct_handle = PTL_CT_NONE;
ret = PtlMDBind(ompi_mtl_portals4.ni_h,
&md,
&ptl_request->md_h);
if (PTL_OK != ret) {
opal_output_verbose(ompi_mtl_base_output, 1,
"%s:%d: PtlMDBind failed: %d",
__FILE__, __LINE__, ret);
return ompi_mtl_portals4_get_error(ret);
}
me.start = start;
me.length = length;
me.ct_handle = PTL_CT_NONE;
me.min_free = 0;
me.ac_id.uid = PTL_UID_ANY;
me.options = PTL_ME_OP_GET | PTL_ME_USE_ONCE;
me.match_id = dest;
me.match_bits = (ptl_match_bits_t)(uintptr_t)ptl_request;
me.ignore_bits = 0;
ret = PtlMEAppend(ompi_mtl_portals4.ni_h,
PTL_READ_TABLE_ID,
&me,
PTL_PRIORITY_LIST,
ptl_request,
&ptl_request->me_h);
if (PTL_OK != ret) {
opal_output_verbose(ompi_mtl_base_output, 1,
"%s:%d: PtlMEAppend failed: %d",
__FILE__, __LINE__, ret);
PtlMDRelease(ptl_request->md_h);
return ompi_mtl_portals4_get_error(ret);
}
ret = PtlPut(ptl_request->md_h,
0,
length,
PTL_ACK_REQ,
dest,
PTL_SEND_TABLE_ID,
match_bits,
0,
ptl_request,
(ptl_hdr_data_t)(uintptr_t)ptl_request);
if (PTL_OK != ret) {
opal_output_verbose(ompi_mtl_base_output, 1,
"%s:%d: PtlPut failed: %d",
__FILE__, __LINE__, ret);
PtlMEUnlink(ptl_request->me_h);
PtlMDRelease(ptl_request->md_h);
return ompi_mtl_portals4_get_error(ret);
}
return OMPI_SUCCESS;
}
static int
ompi_mtl_portals4_sync_isend( void *start, int length, int contextid, int localrank, int tag,
ptl_process_t dest, ompi_mtl_portals4_request_t *ptl_request )
{
int ret;
ptl_match_bits_t match_bits;
ptl_md_t md;
ptl_me_t me;
ptl_request->event_callback = ompi_mtl_portals4_sync_callback;
PTL_SET_SEND_BITS(match_bits, contextid, localrank, tag, PTL_SHORT_MSG);
md.start = start;
md.length = length;
md.options = 0;
md.eq_handle = ompi_mtl_portals4.eq_h;
md.ct_handle = PTL_CT_NONE;
ret = PtlMDBind(ompi_mtl_portals4.ni_h,
&md,
&ptl_request->md_h);
if (PTL_OK != ret) {
opal_output_verbose(ompi_mtl_base_output, 1,
"%s:%d: PtlMDBind failed: %d",
__FILE__, __LINE__, ret);
return ompi_mtl_portals4_get_error(ret);
}
me.start = NULL;
me.length = 0;
me.ct_handle = PTL_CT_NONE;
me.min_free = 0;
me.ac_id.uid = PTL_UID_ANY;
me.options = PTL_ME_OP_PUT | PTL_ME_USE_ONCE;
me.match_id = dest;
me.match_bits = (ptl_match_bits_t)(uintptr_t)ptl_request;
me.ignore_bits = 0;
ret = PtlMEAppend(ompi_mtl_portals4.ni_h,
PTL_READ_TABLE_ID,
&me,
PTL_PRIORITY_LIST,
ptl_request,
&ptl_request->me_h);
if (PTL_OK != ret) {
opal_output_verbose(ompi_mtl_base_output, 1,
"%s:%d: PtlMEAppend failed: %d",
__FILE__, __LINE__, ret);
PtlMDRelease(ptl_request->md_h);
return ompi_mtl_portals4_get_error(ret);
}
ret = PtlPut(ptl_request->md_h,
0,
length,
PTL_ACK_REQ,
dest,
PTL_SEND_TABLE_ID,
match_bits,
0,
ptl_request,
(ptl_hdr_data_t)(uintptr_t)ptl_request);
if (PTL_OK != ret) {
opal_output_verbose(ompi_mtl_base_output, 1,
"%s:%d: PtlPut failed: %d",
__FILE__, __LINE__, ret);
PtlMEUnlink(ptl_request->me_h);
PtlMDRelease(ptl_request->md_h);
return ompi_mtl_portals4_get_error(ret);
}
return OMPI_SUCCESS;
}
int
ompi_mtl_portals4_isend(struct mca_mtl_base_module_t* mtl,
struct ompi_communicator_t* comm,
@ -34,6 +335,68 @@ ompi_mtl_portals4_isend(struct mca_mtl_base_module_t* mtl,
bool blocking,
mca_mtl_request_t *mtl_request)
{
return OMPI_SUCCESS;
}
int ret = OMPI_SUCCESS;
ompi_proc_t *ompi_proc = ompi_comm_peer_lookup( comm, dest );
mca_mtl_base_endpoint_t *endpoint = (mca_mtl_base_endpoint_t*)ompi_proc->proc_pml;
ompi_mtl_portals4_request_t *ptl_request = (ompi_mtl_portals4_request_t*)mtl_request;
void *start;
size_t length;
bool free_after;
ret = ompi_mtl_datatype_pack(convertor, &start, &length, &free_after);
if (OMPI_SUCCESS != ret) return ret;
ptl_request->buffer_ptr = (free_after) ? start : NULL;
ptl_request->event_count = 0;
ptl_request->super.ompi_req->req_status.MPI_ERROR = OMPI_SUCCESS;
switch (mode) {
case MCA_PML_BASE_SEND_STANDARD:
case MCA_PML_BASE_SEND_READY:
case MCA_PML_BASE_SEND_BUFFERED:
if ((length <= ompi_mtl_portals4.eager_limit) ||
(MCA_PML_BASE_SEND_READY == mode)) {
ret = ompi_mtl_portals4_short_isend(mode,
start,
length,
comm->c_contextid,
comm->c_my_rank,
tag,
endpoint->ptl_proc,
ptl_request);
break;
}
/* long standard send case falls through */
case MCA_PML_BASE_SEND_SYNCHRONOUS:
if (length <= ompi_mtl_portals4.eager_limit) {
ret = ompi_mtl_portals4_sync_isend(start,
length,
comm->c_contextid,
comm->c_my_rank,
tag,
endpoint->ptl_proc,
ptl_request);
} else {
/* if we got this far, we're either a standard or synchronous long send */
ret = ompi_mtl_portals4_long_isend(start,
length,
comm->c_contextid,
comm->c_my_rank,
tag,
endpoint->ptl_proc,
ptl_request);
}
break;
default:
opal_output(fileno(stderr),"Unexpected msg type %dn", mode);
ret = OMPI_ERR_NOT_SUPPORTED;
}
if (OMPI_SUCCESS != ret && NULL != ptl_request->buffer_ptr) {
free(ptl_request->buffer_ptr);
}
return ret;
}

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

@ -1,115 +0,0 @@
/*
* Copyright (c) 2004-2006 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 "opal/util/output.h"
#include "mtl_portals.h"
#include "mtl_portals_request.h"
#include "mtl_portals_send_short.h"
static ompi_mtl_portals_request_t ptl_short_request;
/* short send callback */
static int
ompi_mtl_portals_short_callback(ptl_event_t *ev, ompi_mtl_portals_request_t *ptl_request)
{
switch (ev->type) {
case PTL_EVENT_SEND_END:
ompi_mtl_portals_free_short_buf(ev->offset);
break;
default:
opal_output(fileno(stderr)," Unexpected event type %d in ompi_mtl_portals_short_callback()\n",ev->type);
abort();
}
return OMPI_SUCCESS;
}
/* initialize short copy blocks */
void
ompi_mtl_portals_short_setup()
{
int ret;
int i;
if ((ompi_mtl_portals.ptl_num_copy_blocks > 0) && (ompi_mtl_portals.ptl_copy_block_len > 0)) {
ompi_mtl_portals.ptl_short_md.length = ompi_mtl_portals.ptl_num_copy_blocks *
ompi_mtl_portals.ptl_copy_block_len;
ompi_mtl_portals.ptl_short_md.start = malloc(ompi_mtl_portals.ptl_short_md.length);
if (NULL == ompi_mtl_portals.ptl_short_md.start ) {
ompi_mtl_portals.ptl_num_copy_blocks = 0;
return;
}
ompi_mtl_portals.ptl_short_md.threshold = PTL_MD_THRESH_INF;
ompi_mtl_portals.ptl_short_md.max_size = 0;
ompi_mtl_portals.ptl_short_md.options = PTL_MD_EVENT_START_DISABLE;
ompi_mtl_portals.ptl_short_md.user_ptr = &ptl_short_request;
ompi_mtl_portals.ptl_short_md.eq_handle = ompi_mtl_portals.ptl_eq_h;
ret = PtlMDBind(ompi_mtl_portals.ptl_ni_h,
ompi_mtl_portals.ptl_short_md,
PTL_RETAIN,
&ompi_mtl_portals.ptl_short_md_h);
if (PTL_OK != ret) {
free(ompi_mtl_portals.ptl_short_md.start);
ompi_mtl_portals.ptl_num_copy_blocks = 0;
return;
}
ptl_short_request.event_callback = ompi_mtl_portals_short_callback;
ompi_mtl_portals.ptl_copy_block_free_list = malloc(ompi_mtl_portals.ptl_num_copy_blocks * sizeof(int));
if (NULL == ompi_mtl_portals.ptl_copy_block_free_list) {
free(ompi_mtl_portals.ptl_short_md.start);
ompi_mtl_portals.ptl_num_copy_blocks = 0;
return;
}
for (i=0; i<ompi_mtl_portals.ptl_num_copy_blocks; i++) {
ompi_mtl_portals.ptl_copy_block_free_list[i] = i;
}
ompi_mtl_portals.ptl_copy_block_first_free = 0;
}
}
/* free short resources */
void
ompi_mtl_portals_short_cleanup()
{
if (ompi_mtl_portals.ptl_num_copy_blocks > 0) {
free(ompi_mtl_portals.ptl_short_md.start);
free(ompi_mtl_portals.ptl_copy_block_free_list);
ompi_mtl_portals.ptl_num_copy_blocks = 0;
}
}

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

@ -1,59 +0,0 @@
/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2006 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$
*/
#ifndef OMPI_MTL_PORTALS_SEND_SHORT_H
#define OMPI_MTL_PORTALS_SEND_SHORT_H
extern void ompi_mtl_portals_short_setup(void);
extern void ompi_mtl_portals_short_cleanup(void);
static inline int
ompi_mtl_portals_alloc_short_buf(void)
{
int buf_num;
while ( ompi_mtl_portals.ptl_copy_block_first_free == ompi_mtl_portals.ptl_num_copy_blocks ) {
ompi_mtl_portals_progress();
}
buf_num = ompi_mtl_portals.ptl_copy_block_free_list[ompi_mtl_portals.ptl_copy_block_first_free++];
assert((buf_num >= 0) && (buf_num < ompi_mtl_portals.ptl_num_copy_blocks));
return buf_num;
}
static inline void
ompi_mtl_portals_free_short_buf( int offset )
{
int buf_num;
buf_num = offset / ompi_mtl_portals.ptl_copy_block_len;
assert((buf_num >= 0) && (buf_num < ompi_mtl_portals.ptl_num_copy_blocks));
ompi_mtl_portals.ptl_copy_block_first_free--;
assert(ompi_mtl_portals.ptl_copy_block_first_free >= 0);
ompi_mtl_portals.ptl_copy_block_free_list[ompi_mtl_portals.ptl_copy_block_first_free] = buf_num;
}
#endif /* OMPI_MTL_PORTALS_SEND_SHORT_H */