1
1

Merge pull request #1689 from francois-wellenreiter/remove_trig_rdv_portals4

MTL portals4 : remove the triggered rendez-vous protocol
Этот коммит содержится в:
Todd Kordenbrock 2016-06-06 21:55:01 -05:00
родитель c2a02ab06c b2b0fc63e2
Коммит 9671d6af47
6 изменённых файлов: 88 добавлений и 185 удалений

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

@ -178,7 +178,6 @@ portals4_init_interface(void)
me.ignore_bits = MTL_PORTALS4_CONTEXT_MASK | me.ignore_bits = MTL_PORTALS4_CONTEXT_MASK |
MTL_PORTALS4_SOURCE_MASK | MTL_PORTALS4_SOURCE_MASK |
MTL_PORTALS4_TAG_MASK; MTL_PORTALS4_TAG_MASK;
ret = PtlMEAppend(ompi_mtl_portals4.ni_h, ret = PtlMEAppend(ompi_mtl_portals4.ni_h,
ompi_mtl_portals4.recv_idx, ompi_mtl_portals4.recv_idx,
&me, &me,

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

@ -158,8 +158,7 @@ extern mca_mtl_portals4_module_t ompi_mtl_portals4;
/* send posting */ /* send posting */
#define MTL_PORTALS4_SET_SEND_BITS(match_bits, contextid, source, tag, type) \ #define MTL_PORTALS4_SET_SEND_BITS(match_bits, contextid, source, tag, type) \
{ \ { \
match_bits = 0; \ match_bits = contextid; \
match_bits |= contextid; \
match_bits = (match_bits << 24); \ match_bits = (match_bits << 24); \
match_bits |= source; \ match_bits |= source; \
match_bits = (match_bits << 24); \ match_bits = (match_bits << 24); \
@ -172,7 +171,7 @@ extern mca_mtl_portals4_module_t ompi_mtl_portals4;
match_bits = 0; \ match_bits = 0; \
ignore_bits = MTL_PORTALS4_PROTOCOL_IGNR; \ ignore_bits = MTL_PORTALS4_PROTOCOL_IGNR; \
\ \
match_bits |= contextid; \ match_bits = contextid; \
match_bits = (match_bits << 24); \ match_bits = (match_bits << 24); \
\ \
if (MPI_ANY_SOURCE == source) { \ if (MPI_ANY_SOURCE == source) { \
@ -194,38 +193,30 @@ extern mca_mtl_portals4_module_t ompi_mtl_portals4;
(0 != (MTL_PORTALS4_SHORT_MSG & match_bits)) (0 != (MTL_PORTALS4_SHORT_MSG & match_bits))
#define MTL_PORTALS4_IS_LONG_MSG(match_bits) \ #define MTL_PORTALS4_IS_LONG_MSG(match_bits) \
(0 != (MTL_PORTALS4_LONG_MSG & match_bits)) (0 != (MTL_PORTALS4_LONG_MSG & match_bits))
#define MTL_PORTALS4_IS_READY_MSG(match_bits) \
(0 != (MTL_PORTALS4_READY_MSG & match_bits))
#define MTL_PORTALS4_GET_TAG(match_bits) \ #define MTL_PORTALS4_GET_TAG(match_bits) \
((int)(match_bits & MTL_PORTALS4_TAG_MASK)) ((int)(match_bits & MTL_PORTALS4_TAG_MASK))
#define MTL_PORTALS4_GET_SOURCE(match_bits) \ #define MTL_PORTALS4_GET_SOURCE(match_bits) \
((int)((match_bits & MTL_PORTALS4_SOURCE_MASK) >> 24)) ((int)((match_bits & MTL_PORTALS4_SOURCE_MASK) >> 24))
#define MTL_PORTALS4_GET_CONTEXT(match_bits) \
((int)((match_bits & MTL_PORTALS4_CONTEXT_MASK) >> 48))
#define MTL_PORTALS4_SYNC_MSG 0x8000000000000000ULL #define MTL_PORTALS4_SYNC_MSG 0x8000000000000000ULL
#define MTL_PORTALS4_SET_HDR_DATA(hdr_data, opcount, length, sync) \ #define MTL_PORTALS4_SET_HDR_DATA(hdr_data, opcount, length, sync) \
{ \ { \
hdr_data = 0; \ hdr_data = (sync) ? 1 : 0; \
hdr_data = (hdr_data << 15); \
hdr_data |= opcount & 0x7FFFULL; \ hdr_data |= opcount & 0x7FFFULL; \
hdr_data = (hdr_data << 48); \ hdr_data = (hdr_data << 48); \
hdr_data |= (length & 0xFFFFFFFFFFFFULL); \ hdr_data |= (length & 0xFFFFFFFFFFFFULL); \
hdr_data |= (sync ? MTL_PORTALS4_SYNC_MSG : 0); \
} }
#define MTL_PORTALS4_GET_LENGTH(hdr_data) ((size_t)(hdr_data & 0xFFFFFFFFFFFFULL)) #define MTL_PORTALS4_GET_LENGTH(hdr_data) ((size_t)(hdr_data & 0xFFFFFFFFFFFFULL))
#define MTL_PORTALS4_IS_SYNC_MSG(hdr_data) \ #define MTL_PORTALS4_IS_SYNC_MSG(hdr_data) \
(0 != (MTL_PORTALS4_SYNC_MSG & hdr_data)) (0 != (MTL_PORTALS4_SYNC_MSG & hdr_data))
#define MTL_PORTALS4_SET_READ_BITS(match_bits, contextid, tag) \
{ \
match_bits = 0; \
match_bits |= (contextid & 0x0000000000FFFFFFULL); \
match_bits = (match_bits << 24); \
match_bits |= (tag & 0x0000000000FFFFFFULL); \
}
/* mtl-portals4 helpers */ /* mtl-portals4 helpers */
OMPI_DECLSPEC ompi_proc_t * OMPI_DECLSPEC ompi_proc_t *
ompi_mtl_portals4_get_proc_group(struct ompi_group_t *group, int rank); ompi_mtl_portals4_get_proc_group(struct ompi_group_t *group, int rank);

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

@ -41,7 +41,7 @@ completion_fn(ptl_event_t *ev, ompi_mtl_portals4_base_request_t *ptl_base_reques
ptl_request->status.MPI_SOURCE = MTL_PORTALS4_GET_SOURCE(ev->match_bits); ptl_request->status.MPI_SOURCE = MTL_PORTALS4_GET_SOURCE(ev->match_bits);
ptl_request->status.MPI_TAG = MTL_PORTALS4_GET_TAG(ev->match_bits); ptl_request->status.MPI_TAG = MTL_PORTALS4_GET_TAG(ev->match_bits);
ptl_request->status.MPI_ERROR = MPI_SUCCESS; ptl_request->status.MPI_ERROR = MPI_SUCCESS;
ptl_request->status._ucount =MTL_PORTALS4_GET_LENGTH(ev->hdr_data); ptl_request->status._ucount = MTL_PORTALS4_GET_LENGTH(ev->hdr_data);
if (ev->type != PTL_EVENT_SEARCH) { if (ev->type != PTL_EVENT_SEARCH) {
ptl_request->message = ompi_mtl_portals4_message_alloc(ev); ptl_request->message = ompi_mtl_portals4_message_alloc(ev);
} }

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

@ -34,41 +34,6 @@
#include "mtl_portals4_recv_short.h" #include "mtl_portals4_recv_short.h"
#include "mtl_portals4_message.h" #include "mtl_portals4_message.h"
static int
triggered_read_msg(void *start, ptl_size_t length, ptl_process_t target,
ptl_match_bits_t match_bits, ptl_size_t remote_offset,
ompi_mtl_portals4_recv_request_t *request)
{
int ret;
ret = PtlCTAlloc(ompi_mtl_portals4.ni_h, &request->ct_h);
if (OPAL_UNLIKELY(PTL_OK != ret)) {
opal_output_verbose(1, ompi_mtl_base_framework.framework_output,
"%s:%d: PtlCTAlloc failed: %d",
__FILE__, __LINE__, ret);
return OMPI_ERR_OUT_OF_RESOURCE;
}
ret = PtlTriggeredGet(ompi_mtl_portals4.send_md_h,
(ptl_size_t) start,
length,
target,
ompi_mtl_portals4.read_idx,
match_bits,
remote_offset,
request,
request->ct_h, 1);
if (OPAL_UNLIKELY(PTL_OK != ret)) {
PtlCTFree(request->ct_h);
request->ct_h = PTL_INVALID_HANDLE;
opal_output_verbose(1, ompi_mtl_base_framework.framework_output,
"%s:%d: PtlTriggeredGet failed: %d",
__FILE__, __LINE__, ret);
return OMPI_ERR_OUT_OF_RESOURCE;
}
return OMPI_SUCCESS;
}
static int static int
read_msg(void *start, ptl_size_t length, ptl_process_t target, read_msg(void *start, ptl_size_t length, ptl_process_t target,
ptl_match_bits_t match_bits, ptl_size_t remote_offset, ptl_match_bits_t match_bits, ptl_size_t remote_offset,
@ -111,7 +76,6 @@ ompi_mtl_portals4_recv_progress(ptl_event_t *ev,
ompi_mtl_portals4_recv_request_t* ptl_request = ompi_mtl_portals4_recv_request_t* ptl_request =
(ompi_mtl_portals4_recv_request_t*) ptl_base_request; (ompi_mtl_portals4_recv_request_t*) ptl_base_request;
size_t msg_length = 0; size_t msg_length = 0;
ptl_match_bits_t read_match_bits;
/* as soon as we've seen any event associated with a request, it's /* as soon as we've seen any event associated with a request, it's
started */ started */
@ -134,13 +98,13 @@ ompi_mtl_portals4_recv_progress(ptl_event_t *ev,
msg_length = MTL_PORTALS4_GET_LENGTH(ev->hdr_data); msg_length = MTL_PORTALS4_GET_LENGTH(ev->hdr_data);
ptl_request->super.super.ompi_req->req_status.MPI_SOURCE = ptl_request->super.super.ompi_req->req_status.MPI_SOURCE =
MTL_PORTALS4_GET_SOURCE(ev->match_bits); MTL_PORTALS4_GET_SOURCE(ev->match_bits);
ptl_request->super.super.ompi_req->req_status.MPI_TAG = ptl_request->super.super.ompi_req->req_status.MPI_TAG =
MTL_PORTALS4_GET_TAG(ev->match_bits); MTL_PORTALS4_GET_TAG(ev->match_bits);
if (OPAL_UNLIKELY(msg_length > ptl_request->delivery_len)) { if (OPAL_UNLIKELY(msg_length > ptl_request->delivery_len)) {
opal_output_verbose(1, ompi_mtl_base_framework.framework_output, opal_output_verbose(1, ompi_mtl_base_framework.framework_output,
"truncate expected: %ld %ld", "truncate expected: %ld %ld",
msg_length, ptl_request->delivery_len); msg_length, ptl_request->delivery_len);
ptl_request->super.super.ompi_req->req_status.MPI_ERROR = MPI_ERR_TRUNCATE; ptl_request->super.super.ompi_req->req_status.MPI_ERROR = MPI_ERR_TRUNCATE;
} }
@ -152,47 +116,36 @@ ompi_mtl_portals4_recv_progress(ptl_event_t *ev,
/* If it's not a short message and we're doing rndv, we /* If it's not a short message and we're doing rndv, we
only have the first part of the message. Issue the get only have the first part of the message. Issue the get
to pull the second part of the message. */ to pull the second part of the message. */
if (ptl_request->is_triggered) { ret = read_msg((char*) ptl_request->delivery_ptr + ompi_mtl_portals4.eager_limit,
ptl_request->super.super.ompi_req->req_status._ucount = 0; ((msg_length > ptl_request->delivery_len) ?
ptl_request->delivery_len : msg_length) - ompi_mtl_portals4.eager_limit,
ev->initiator,
ev->hdr_data,
ompi_mtl_portals4.eager_limit,
ptl_request);
if (OPAL_UNLIKELY(OMPI_SUCCESS != ret)) {
if (NULL != ptl_request->buffer_ptr) free(ptl_request->buffer_ptr);
goto callback_error;
} }
else {
ptl_request->super.super.ompi_req->req_status._ucount = ompi_mtl_portals4.eager_limit;
MTL_PORTALS4_SET_READ_BITS(read_match_bits,
MTL_PORTALS4_GET_CONTEXT(ev->match_bits),
MTL_PORTALS4_GET_TAG(ev->match_bits));
ret = read_msg((char*) ptl_request->delivery_ptr + ompi_mtl_portals4.eager_limit,
((msg_length > ptl_request->delivery_len) ?
ptl_request->delivery_len : msg_length) - ompi_mtl_portals4.eager_limit,
ev->initiator,
read_match_bits,
ompi_mtl_portals4.eager_limit,
ptl_request);
if (OPAL_UNLIKELY(OMPI_SUCCESS != ret)) {
if (NULL != ptl_request->buffer_ptr) free(ptl_request->buffer_ptr);
goto callback_error;
}
}
} else { } else {
/* If we're either using the eager protocol or were a /* If we're either using the eager protocol or were a
short message, all data has been received, so complete short message, all data has been received, so complete
the message. */ the message. */
ret = ompi_mtl_datatype_unpack(ptl_request->convertor, ret = ompi_mtl_datatype_unpack(ptl_request->convertor,
ev->start, ev->start,
ev->mlength); ev->mlength);
if (OPAL_UNLIKELY(OMPI_SUCCESS != ret)) { if (OPAL_UNLIKELY(OMPI_SUCCESS != ret)) {
opal_output_verbose(1, ompi_mtl_base_framework.framework_output, opal_output_verbose(1, ompi_mtl_base_framework.framework_output,
"%s:%d: ompi_mtl_datatype_unpack failed: %d", "%s:%d: ompi_mtl_datatype_unpack failed: %d",
__FILE__, __LINE__, ret); __FILE__, __LINE__, ret);
ptl_request->super.super.ompi_req->req_status.MPI_ERROR = ret; ptl_request->super.super.ompi_req->req_status.MPI_ERROR = ret;
} }
ptl_request->super.super.ompi_req->req_status._ucount = ev->mlength; ptl_request->super.super.ompi_req->req_status._ucount = ev->mlength;
OPAL_OUTPUT_VERBOSE((50, ompi_mtl_base_framework.framework_output, OPAL_OUTPUT_VERBOSE((50, ompi_mtl_base_framework.framework_output,
"Recv %lu (0x%lx) completed, expected", "Recv %lu (0x%lx) completed, expected",
ptl_request->opcount, ptl_request->hdr_data)); ptl_request->opcount, ptl_request->hdr_data));
ptl_request->super.super.completion_callback(&ptl_request->super.super); ptl_request->super.super.completion_callback(&ptl_request->super.super);
} }
break; break;
@ -209,14 +162,13 @@ ompi_mtl_portals4_recv_progress(ptl_event_t *ev,
goto callback_error; goto callback_error;
} }
if (ptl_request->is_triggered) {
PtlCTFree(ptl_request->ct_h);
ptl_request->ct_h = PTL_INVALID_HANDLE;
}
/* set the received length in the status, now that we know /* set the received length in the status, now that we know
exactly how much data was sent. */ excatly how much data was sent. */
ptl_request->super.super.ompi_req->req_status._ucount += ev->mlength; ptl_request->super.super.ompi_req->req_status._ucount = ev->mlength;
if (ompi_mtl_portals4.protocol == rndv) {
ptl_request->super.super.ompi_req->req_status._ucount +=
ompi_mtl_portals4.eager_limit;
}
#if OMPI_MTL_PORTALS4_FLOW_CONTROL #if OMPI_MTL_PORTALS4_FLOW_CONTROL
OPAL_THREAD_ADD32(&ompi_mtl_portals4.flowctl.send_slots, 1); OPAL_THREAD_ADD32(&ompi_mtl_portals4.flowctl.send_slots, 1);
@ -245,13 +197,13 @@ ompi_mtl_portals4_recv_progress(ptl_event_t *ev,
case PTL_EVENT_PUT_OVERFLOW: case PTL_EVENT_PUT_OVERFLOW:
OPAL_OUTPUT_VERBOSE((50, ompi_mtl_base_framework.framework_output, OPAL_OUTPUT_VERBOSE((50, ompi_mtl_base_framework.framework_output,
"Recv %lu (0x%lx) got put_overflow event", "Recv %lu (0x%lx) got put_overflow event",
ptl_request->opcount, ev->hdr_data)); ptl_request->opcount, ev->hdr_data));
if (OPAL_UNLIKELY(ev->ni_fail_type != PTL_NI_OK)) { if (OPAL_UNLIKELY(ev->ni_fail_type != PTL_NI_OK)) {
opal_output_verbose(1, ompi_mtl_base_framework.framework_output, opal_output_verbose(1, ompi_mtl_base_framework.framework_output,
"%s:%d: PTL_EVENT_PUT_OVERFLOW with ni_fail_type: %d", "%s:%d: PTL_EVENT_PUT_OVERFLOW with ni_fail_type: %d",
__FILE__, __LINE__, ev->ni_fail_type); __FILE__, __LINE__, ev->ni_fail_type);
goto callback_error; goto callback_error;
} }
@ -259,25 +211,25 @@ ompi_mtl_portals4_recv_progress(ptl_event_t *ev,
msg_length = MTL_PORTALS4_GET_LENGTH(ev->hdr_data); msg_length = MTL_PORTALS4_GET_LENGTH(ev->hdr_data);
ptl_request->super.super.ompi_req->req_status.MPI_SOURCE = ptl_request->super.super.ompi_req->req_status.MPI_SOURCE =
MTL_PORTALS4_GET_SOURCE(ev->match_bits); MTL_PORTALS4_GET_SOURCE(ev->match_bits);
ptl_request->super.super.ompi_req->req_status.MPI_TAG = ptl_request->super.super.ompi_req->req_status.MPI_TAG =
MTL_PORTALS4_GET_TAG(ev->match_bits); MTL_PORTALS4_GET_TAG(ev->match_bits);
if (OPAL_UNLIKELY(msg_length > ptl_request->delivery_len)) { if (OPAL_UNLIKELY(msg_length > ptl_request->delivery_len)) {
opal_output_verbose(1, ompi_mtl_base_framework.framework_output, opal_output_verbose(1, ompi_mtl_base_framework.framework_output,
"truncate unexpected: %ld %ld %d", "truncate unexpected: %ld %ld %d",
msg_length, ptl_request->delivery_len, msg_length, ptl_request->delivery_len,
MTL_PORTALS4_IS_SHORT_MSG(ev->match_bits)); MTL_PORTALS4_IS_SHORT_MSG(ev->match_bits));
ptl_request->super.super.ompi_req->req_status.MPI_ERROR = MPI_ERR_TRUNCATE; ptl_request->super.super.ompi_req->req_status.MPI_ERROR = MPI_ERR_TRUNCATE;
} }
#if OPAL_ENABLE_DEBUG #if OPAL_ENABLE_DEBUG
ptl_request->hdr_data = ev->hdr_data; ptl_request->hdr_data = ev->hdr_data;
#endif #endif
ptl_request->super.super.ompi_req->req_status._ucount = ev->mlength;
/* overflow case. Short messages have the buffer stashed /* overflow case. Short messages have the buffer stashed
somewhere. Long messages left in buffer at the source */ somewhere. Long messages left in buffer at the source */
if (MTL_PORTALS4_IS_SHORT_MSG(ev->match_bits)) { if (MTL_PORTALS4_IS_SHORT_MSG(ev->match_bits)) {
ptl_request->super.super.ompi_req->req_status._ucount = ev->mlength;
if (ev->mlength > 0) { if (ev->mlength > 0) {
struct iovec iov; struct iovec iov;
uint32_t iov_count = 1; uint32_t iov_count = 1;
@ -287,70 +239,63 @@ ompi_mtl_portals4_recv_progress(ptl_event_t *ev,
max_data = iov.iov_len; max_data = iov.iov_len;
ret = opal_convertor_unpack(ptl_request->convertor, ret = opal_convertor_unpack(ptl_request->convertor,
&iov, &iov_count, &iov, &iov_count,
&max_data ); &max_data );
if (NULL != ptl_request->buffer_ptr) free(ptl_request->buffer_ptr); if (NULL != ptl_request->buffer_ptr) free(ptl_request->buffer_ptr);
if (OPAL_UNLIKELY(ret < 0)) { if (OPAL_UNLIKELY(ret < 0)) {
opal_output_verbose(1, ompi_mtl_base_framework.framework_output, opal_output_verbose(1, ompi_mtl_base_framework.framework_output,
"%s:%d: opal_convertor_unpack failed: %d", "%s:%d: opal_convertor_unpack failed: %d",
__FILE__, __LINE__, ret); __FILE__, __LINE__, ret);
goto callback_error; goto callback_error;
} }
} }
/* if it's a sync, send the ack */ /* if it's a sync, send the ack */
if (MTL_PORTALS4_IS_SYNC_MSG(ev->hdr_data)) { if (MTL_PORTALS4_IS_SYNC_MSG(ev->hdr_data)) {
OPAL_OUTPUT_VERBOSE((50, ompi_mtl_base_framework.framework_output, OPAL_OUTPUT_VERBOSE((50, ompi_mtl_base_framework.framework_output,
"Recv %lu (0x%lx) sending sync ack", "Recv %lu (0x%lx) sending sync ack",
ptl_request->opcount, ptl_request->hdr_data)); ptl_request->opcount, ptl_request->hdr_data));
ret = PtlPut(ompi_mtl_portals4.zero_md_h, ret = PtlPut(ompi_mtl_portals4.zero_md_h,
0, 0,
0, 0,
PTL_NO_ACK_REQ, PTL_NO_ACK_REQ,
ev->initiator, ev->initiator,
ompi_mtl_portals4.read_idx, ompi_mtl_portals4.read_idx,
ev->hdr_data, ev->hdr_data,
0, 0,
NULL, NULL,
0); 0);
if (OPAL_UNLIKELY(PTL_OK != ret)) { if (OPAL_UNLIKELY(PTL_OK != ret)) {
opal_output_verbose(1, ompi_mtl_base_framework.framework_output, opal_output_verbose(1, ompi_mtl_base_framework.framework_output,
"%s:%d: PtlPut failed: %d", "%s:%d: PtlPut failed: %d",
__FILE__, __LINE__, ret); __FILE__, __LINE__, ret);
goto callback_error; goto callback_error;
} }
} }
OPAL_OUTPUT_VERBOSE((50, ompi_mtl_base_framework.framework_output, OPAL_OUTPUT_VERBOSE((50, ompi_mtl_base_framework.framework_output,
"Recv %lu (0x%lx) completed, unexpected short (0x%lx)", "Recv %lu (0x%lx) completed, unexpected short (0x%lx)",
ptl_request->opcount, ptl_request->hdr_data, (long) ev->start)); ptl_request->opcount, ptl_request->hdr_data, (long) ev->start));
ptl_request->super.super.completion_callback(&ptl_request->super.super); ptl_request->super.super.completion_callback(&ptl_request->super.super);
} else { } else {
if (!ptl_request->is_triggered) { if (ev->mlength > 0) {
/* if rndv or triggered, copy the eager part to the right place */
memcpy(ptl_request->delivery_ptr, ev->start, ev->mlength);
}
if (ev->mlength > 0) { ret = read_msg((char*) ptl_request->delivery_ptr + ev->mlength,
/* if rndv or triggered, copy the eager part to the right place */ ((msg_length > ptl_request->delivery_len) ?
memcpy(ptl_request->delivery_ptr, ev->start, ev->mlength); ptl_request->delivery_len : msg_length) - ev->mlength,
} ev->initiator,
ev->hdr_data,
ev->mlength,
MTL_PORTALS4_SET_READ_BITS(read_match_bits, ptl_request);
MTL_PORTALS4_GET_CONTEXT(ev->match_bits), if (OPAL_UNLIKELY(OMPI_SUCCESS != ret)) {
MTL_PORTALS4_GET_TAG(ev->match_bits)); if (NULL != ptl_request->buffer_ptr) free(ptl_request->buffer_ptr);
goto callback_error;
ret = read_msg((char*) ptl_request->delivery_ptr + ev->mlength,
((msg_length > ptl_request->delivery_len) ?
ptl_request->delivery_len : msg_length) - ev->mlength,
ev->initiator,
read_match_bits,
ev->mlength,
ptl_request);
if (OPAL_UNLIKELY(OMPI_SUCCESS != ret)) {
if (NULL != ptl_request->buffer_ptr) free(ptl_request->buffer_ptr);
goto callback_error;
}
} }
} }
break; break;
case PTL_EVENT_LINK: case PTL_EVENT_LINK:
@ -381,7 +326,7 @@ ompi_mtl_portals4_irecv(struct mca_mtl_base_module_t* mtl,
struct opal_convertor_t *convertor, struct opal_convertor_t *convertor,
mca_mtl_request_t *mtl_request) mca_mtl_request_t *mtl_request)
{ {
ptl_match_bits_t read_match_bits, recv_match_bits, recv_ignore_bits; ptl_match_bits_t match_bits, ignore_bits;
int ret = OMPI_SUCCESS; int ret = OMPI_SUCCESS;
ptl_process_t remote_proc; ptl_process_t remote_proc;
ompi_mtl_portals4_recv_request_t *ptl_request = ompi_mtl_portals4_recv_request_t *ptl_request =
@ -405,11 +350,9 @@ ompi_mtl_portals4_irecv(struct mca_mtl_base_module_t* mtl,
remote_proc = *((ptl_process_t*) ompi_mtl_portals4_get_endpoint (mtl, ompi_proc)); remote_proc = *((ptl_process_t*) ompi_mtl_portals4_get_endpoint (mtl, ompi_proc));
} }
MTL_PORTALS4_SET_RECV_BITS(recv_match_bits, recv_ignore_bits, comm->c_contextid, MTL_PORTALS4_SET_RECV_BITS(match_bits, ignore_bits, comm->c_contextid,
src, tag); src, tag);
MTL_PORTALS4_SET_READ_BITS(read_match_bits, comm->c_contextid, tag);
ret = ompi_mtl_datatype_recv_buf(convertor, &start, &length, &free_after); ret = ompi_mtl_datatype_recv_buf(convertor, &start, &length, &free_after);
if (OPAL_UNLIKELY(OMPI_SUCCESS != ret)) { if (OPAL_UNLIKELY(OMPI_SUCCESS != ret)) {
return ret; return ret;
@ -427,50 +370,28 @@ ompi_mtl_portals4_irecv(struct mca_mtl_base_module_t* mtl,
ptl_request->delivery_len = length; ptl_request->delivery_len = length;
ptl_request->req_started = false; ptl_request->req_started = false;
ptl_request->super.super.ompi_req->req_status.MPI_ERROR = OMPI_SUCCESS; ptl_request->super.super.ompi_req->req_status.MPI_ERROR = OMPI_SUCCESS;
ptl_request->super.super.ompi_req->req_status._ucount = 0;
ptl_request->is_triggered =
((ompi_mtl_portals4.protocol == eager) ||
(ompi_mtl_portals4.eager_limit >= length) ||
(MPI_ANY_SOURCE == src) ||
(MPI_ANY_TAG == tag)) ? false : true;
if (ptl_request->is_triggered) {
ret = triggered_read_msg((char*) ptl_request->delivery_ptr,
ptl_request->delivery_len,
remote_proc,
read_match_bits,
0,
ptl_request);
}
OPAL_OUTPUT_VERBOSE((50, ompi_mtl_base_framework.framework_output, OPAL_OUTPUT_VERBOSE((50, ompi_mtl_base_framework.framework_output,
"Recv %lu from %x,%x of length %ld (0x%lx, 0x%lx, 0x%lx)\n", "Recv %lu from %x,%x of length %ld (0x%lx, 0x%lx, 0x%lx)\n",
ptl_request->opcount, ptl_request->opcount,
remote_proc.phys.nid, remote_proc.phys.pid, remote_proc.phys.nid, remote_proc.phys.pid,
(int64_t)length, recv_match_bits, recv_ignore_bits, (unsigned long) ptl_request)); (int64_t)length, match_bits, ignore_bits, (unsigned long) ptl_request));
me.start = start; me.start = start;
me.length = length; me.length = length;
if (ptl_request->is_triggered) me.ct_handle = PTL_CT_NONE;
me.ct_handle = ptl_request->ct_h;
else
me.ct_handle = PTL_CT_NONE;
me.min_free = 0; me.min_free = 0;
me.uid = ompi_mtl_portals4.uid; me.uid = ompi_mtl_portals4.uid;
me.options = me.options =
PTL_ME_OP_PUT | PTL_ME_OP_PUT |
PTL_ME_USE_ONCE | PTL_ME_USE_ONCE |
PTL_ME_EVENT_UNLINK_DISABLE; PTL_ME_EVENT_UNLINK_DISABLE;
if (ptl_request->is_triggered)
me.options |= PTL_ME_EVENT_CT_COMM | PTL_ME_EVENT_CT_OVERFLOW;
if (length <= ompi_mtl_portals4.eager_limit) { if (length <= ompi_mtl_portals4.eager_limit) {
me.options |= PTL_ME_EVENT_LINK_DISABLE; me.options |= PTL_ME_EVENT_LINK_DISABLE;
} }
me.match_id = remote_proc; me.match_id = remote_proc;
me.match_bits = recv_match_bits; me.match_bits = match_bits;
me.ignore_bits = recv_ignore_bits; me.ignore_bits = ignore_bits;
ret = PtlMEAppend(ompi_mtl_portals4.ni_h, ret = PtlMEAppend(ompi_mtl_portals4.ni_h,
ompi_mtl_portals4.recv_idx, ompi_mtl_portals4.recv_idx,
@ -530,7 +451,6 @@ ompi_mtl_portals4_imrecv(struct mca_mtl_base_module_t* mtl,
ptl_request->delivery_ptr = start; ptl_request->delivery_ptr = start;
ptl_request->delivery_len = length; ptl_request->delivery_len = length;
ptl_request->super.super.ompi_req->req_status.MPI_ERROR = OMPI_SUCCESS; ptl_request->super.super.ompi_req->req_status.MPI_ERROR = OMPI_SUCCESS;
ptl_request->super.super.ompi_req->req_status._ucount = 0;
OPAL_OUTPUT_VERBOSE((50, ompi_mtl_base_framework.framework_output, OPAL_OUTPUT_VERBOSE((50, ompi_mtl_base_framework.framework_output,
"Mrecv %lu of length %ld (0x%lx)\n", "Mrecv %lu of length %ld (0x%lx)\n",

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

@ -69,8 +69,6 @@ struct ompi_mtl_portals4_recv_request_t {
ompi_mtl_portals4_base_request_t super; ompi_mtl_portals4_base_request_t super;
void *buffer_ptr; void *buffer_ptr;
ptl_handle_me_t me_h; ptl_handle_me_t me_h;
ptl_handle_ct_t ct_h;
bool is_triggered;
struct opal_convertor_t *convertor; struct opal_convertor_t *convertor;
void *delivery_ptr; void *delivery_ptr;
size_t delivery_len; size_t delivery_len;

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

@ -182,7 +182,7 @@ ompi_mtl_portals4_short_isend(mca_pml_base_send_mode_t mode,
ompi_mtl_portals4_isend_request_t *ptl_request) ompi_mtl_portals4_isend_request_t *ptl_request)
{ {
int ret; int ret;
ptl_match_bits_t read_match_bits, match_bits; ptl_match_bits_t match_bits;
ptl_me_t me; ptl_me_t me;
ptl_hdr_data_t hdr_data; ptl_hdr_data_t hdr_data;
@ -190,12 +190,9 @@ ompi_mtl_portals4_short_isend(mca_pml_base_send_mode_t mode,
MTL_PORTALS4_SHORT_MSG); MTL_PORTALS4_SHORT_MSG);
MTL_PORTALS4_SET_HDR_DATA(hdr_data, ptl_request->opcount, length, MTL_PORTALS4_SET_HDR_DATA(hdr_data, ptl_request->opcount, length,
MCA_PML_BASE_SEND_SYNCHRONOUS == mode); (MCA_PML_BASE_SEND_SYNCHRONOUS == mode) ? 1 : 0);
if (MCA_PML_BASE_SEND_SYNCHRONOUS == mode) { if (MCA_PML_BASE_SEND_SYNCHRONOUS == mode) {
MTL_PORTALS4_SET_READ_BITS(read_match_bits, contextid, tag);
me.start = NULL; me.start = NULL;
me.length = 0; me.length = 0;
me.ct_handle = PTL_CT_NONE; me.ct_handle = PTL_CT_NONE;
@ -207,7 +204,7 @@ ompi_mtl_portals4_short_isend(mca_pml_base_send_mode_t mode,
PTL_ME_EVENT_LINK_DISABLE | PTL_ME_EVENT_LINK_DISABLE |
PTL_ME_EVENT_UNLINK_DISABLE; PTL_ME_EVENT_UNLINK_DISABLE;
me.match_id = ptl_proc; me.match_id = ptl_proc;
me.match_bits = read_match_bits; me.match_bits = hdr_data;
me.ignore_bits = 0; me.ignore_bits = 0;
ret = PtlMEAppend(ompi_mtl_portals4.ni_h, ret = PtlMEAppend(ompi_mtl_portals4.ni_h,
@ -269,7 +266,7 @@ ompi_mtl_portals4_long_isend(void *start, size_t length, int contextid, int tag,
ompi_mtl_portals4_isend_request_t *ptl_request) ompi_mtl_portals4_isend_request_t *ptl_request)
{ {
int ret; int ret;
ptl_match_bits_t read_match_bits, match_bits; ptl_match_bits_t match_bits;
ptl_me_t me; ptl_me_t me;
ptl_hdr_data_t hdr_data; ptl_hdr_data_t hdr_data;
ptl_size_t put_length; ptl_size_t put_length;
@ -277,8 +274,6 @@ ompi_mtl_portals4_long_isend(void *start, size_t length, int contextid, int tag,
MTL_PORTALS4_SET_SEND_BITS(match_bits, contextid, localrank, tag, MTL_PORTALS4_SET_SEND_BITS(match_bits, contextid, localrank, tag,
MTL_PORTALS4_LONG_MSG); MTL_PORTALS4_LONG_MSG);
MTL_PORTALS4_SET_READ_BITS(read_match_bits, contextid, tag);
MTL_PORTALS4_SET_HDR_DATA(hdr_data, ptl_request->opcount, length, 0); MTL_PORTALS4_SET_HDR_DATA(hdr_data, ptl_request->opcount, length, 0);
me.start = start; me.start = start;
@ -292,7 +287,7 @@ ompi_mtl_portals4_long_isend(void *start, size_t length, int contextid, int tag,
PTL_ME_EVENT_LINK_DISABLE | PTL_ME_EVENT_LINK_DISABLE |
PTL_ME_EVENT_UNLINK_DISABLE; PTL_ME_EVENT_UNLINK_DISABLE;
me.match_id = ptl_proc; me.match_id = ptl_proc;
me.match_bits = read_match_bits; me.match_bits = hdr_data;
me.ignore_bits = 0; me.ignore_bits = 0;
ret = PtlMEAppend(ompi_mtl_portals4.ni_h, ret = PtlMEAppend(ompi_mtl_portals4.ni_h,