* Set all appropriate flags for portal table entries
* split eq into send and receive eqs so that we can control the number of outstanding events in send eq and ensure we never lose an ack * Shouldn't ever truncate on short unexpected receive bocks, so don't set the truncate bit * Track active vs. waiting for free short unexpected receive blocks so to ensure an active short unexpected receive block is posted coming out of flow control. Also allow creation of "temporary" blocks which should be released once FREE event is received. * Slight reorganization of some code in preparation for more flow control work. This commit was SVN r26174.
Этот коммит содержится в:
родитель
0fb6f1c7ac
Коммит
1c6b5a1358
@ -134,19 +134,21 @@ ompi_mtl_portals4_finalize(struct mca_mtl_base_module_t *mtl)
|
|||||||
opal_progress_unregister(ompi_mtl_portals4_progress);
|
opal_progress_unregister(ompi_mtl_portals4_progress);
|
||||||
while (0 != ompi_mtl_portals4_progress()) { }
|
while (0 != ompi_mtl_portals4_progress()) { }
|
||||||
|
|
||||||
ompi_mtl_portals4_recv_short_fini(&ompi_mtl_portals4);
|
ompi_mtl_portals4_recv_short_fini();
|
||||||
|
|
||||||
PtlMEUnlink(ompi_mtl_portals4.long_overflow_me_h);
|
PtlMEUnlink(ompi_mtl_portals4.long_overflow_me_h);
|
||||||
PtlMDRelease(ompi_mtl_portals4.zero_md_h);
|
PtlMDRelease(ompi_mtl_portals4.zero_md_h);
|
||||||
PtlPTFree(ompi_mtl_portals4.ni_h, ompi_mtl_portals4.read_idx);
|
PtlPTFree(ompi_mtl_portals4.ni_h, ompi_mtl_portals4.read_idx);
|
||||||
PtlPTFree(ompi_mtl_portals4.ni_h, ompi_mtl_portals4.send_idx);
|
PtlPTFree(ompi_mtl_portals4.ni_h, ompi_mtl_portals4.send_idx);
|
||||||
PtlEQFree(ompi_mtl_portals4.eq_h);
|
PtlEQFree(ompi_mtl_portals4.send_eq_h);
|
||||||
|
PtlEQFree(ompi_mtl_portals4.recv_eq_h);
|
||||||
PtlNIFini(ompi_mtl_portals4.ni_h);
|
PtlNIFini(ompi_mtl_portals4.ni_h);
|
||||||
PtlFini();
|
PtlFini();
|
||||||
|
|
||||||
return OMPI_SUCCESS;
|
return OMPI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
ompi_mtl_portals4_cancel(struct mca_mtl_base_module_t* mtl,
|
ompi_mtl_portals4_cancel(struct mca_mtl_base_module_t* mtl,
|
||||||
mca_mtl_request_t *mtl_request,
|
mca_mtl_request_t *mtl_request,
|
||||||
@ -154,65 +156,3 @@ ompi_mtl_portals4_cancel(struct mca_mtl_base_module_t* mtl,
|
|||||||
{
|
{
|
||||||
return OMPI_SUCCESS;
|
return OMPI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
|
||||||
ompi_mtl_portals4_progress(void)
|
|
||||||
{
|
|
||||||
int count = 0, ret;
|
|
||||||
ptl_event_t ev;
|
|
||||||
ompi_mtl_portals4_base_request_t *ptl_request;
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
ret = PtlEQGet(ompi_mtl_portals4.eq_h, &ev);
|
|
||||||
if (PTL_OK == ret) {
|
|
||||||
OPAL_OUTPUT_VERBOSE((60, ompi_mtl_base_output,
|
|
||||||
"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:
|
|
||||||
case PTL_EVENT_REPLY:
|
|
||||||
case PTL_EVENT_SEND:
|
|
||||||
case PTL_EVENT_ACK:
|
|
||||||
case PTL_EVENT_AUTO_FREE:
|
|
||||||
case PTL_EVENT_SEARCH:
|
|
||||||
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_PT_DISABLED:
|
|
||||||
/* BWB: FIX ME: do stuff - flow control */
|
|
||||||
opal_output(ompi_mtl_base_output, "Unhandled send flow control event.");
|
|
||||||
abort();
|
|
||||||
break;
|
|
||||||
case PTL_EVENT_AUTO_UNLINK:
|
|
||||||
opal_output_verbose(1, ompi_mtl_base_output,
|
|
||||||
"Unexpected auto unlink event");
|
|
||||||
break;
|
|
||||||
case PTL_EVENT_LINK:
|
|
||||||
case PTL_EVENT_GET_OVERFLOW:
|
|
||||||
case PTL_EVENT_FETCH_ATOMIC:
|
|
||||||
case PTL_EVENT_FETCH_ATOMIC_OVERFLOW:
|
|
||||||
opal_output_verbose(1, ompi_mtl_base_output,
|
|
||||||
"Unexpected event of type %d", ev.type);
|
|
||||||
}
|
|
||||||
} else if (PTL_EQ_EMPTY == ret) {
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
opal_output(ompi_mtl_base_output,
|
|
||||||
"Error returned from PtlEQGet: %d", ret);
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
|
@ -33,6 +33,8 @@
|
|||||||
|
|
||||||
BEGIN_C_DECLS
|
BEGIN_C_DECLS
|
||||||
|
|
||||||
|
struct mca_mtl_portals4_send_request_t;
|
||||||
|
|
||||||
struct mca_mtl_portals4_module_t {
|
struct mca_mtl_portals4_module_t {
|
||||||
mca_mtl_base_module_t base;
|
mca_mtl_base_module_t base;
|
||||||
|
|
||||||
@ -47,15 +49,15 @@ struct mca_mtl_portals4_module_t {
|
|||||||
|
|
||||||
/* global handles */
|
/* global handles */
|
||||||
ptl_handle_ni_t ni_h;
|
ptl_handle_ni_t ni_h;
|
||||||
ptl_handle_eq_t eq_h;
|
ptl_handle_eq_t eqs_h[2];
|
||||||
|
|
||||||
/* for zero-length sends and acks */
|
/* for zero-length sends and acks */
|
||||||
ptl_handle_md_t zero_md_h;
|
ptl_handle_md_t zero_md_h;
|
||||||
/* long message receive overflow */
|
/* long message receive overflow */
|
||||||
ptl_handle_me_t long_overflow_me_h;
|
ptl_handle_me_t long_overflow_me_h;
|
||||||
ompi_mtl_portals4_request_t long_overflow_request;
|
|
||||||
|
|
||||||
opal_list_t recv_short_blocks;
|
opal_list_t active_recv_short_blocks;
|
||||||
|
opal_list_t waiting_recv_short_blocks;
|
||||||
|
|
||||||
/* number of operations started */
|
/* number of operations started */
|
||||||
uint32_t opcount;
|
uint32_t opcount;
|
||||||
@ -67,10 +69,14 @@ struct mca_mtl_portals4_module_t {
|
|||||||
};
|
};
|
||||||
typedef struct mca_mtl_portals4_module_t mca_mtl_portals4_module_t;
|
typedef struct mca_mtl_portals4_module_t mca_mtl_portals4_module_t;
|
||||||
|
|
||||||
|
#define send_eq_h eqs_h[0]
|
||||||
|
#define recv_eq_h eqs_h[1]
|
||||||
|
|
||||||
extern mca_mtl_portals4_module_t ompi_mtl_portals4;
|
extern mca_mtl_portals4_module_t ompi_mtl_portals4;
|
||||||
|
|
||||||
#define REQ_SEND_TABLE_ID 2
|
#define REQ_SEND_TABLE_ID 2
|
||||||
#define REQ_READ_TABLE_ID 3
|
#define REQ_READ_TABLE_ID 3
|
||||||
|
#define REQ_FLOWCTL_TABLE_ID 4
|
||||||
|
|
||||||
|
|
||||||
/* match/ignore bit manipulation
|
/* match/ignore bit manipulation
|
||||||
|
@ -35,6 +35,7 @@ static mca_mtl_base_module_t*
|
|||||||
ompi_mtl_portals4_component_init(bool enable_progress_threads,
|
ompi_mtl_portals4_component_init(bool enable_progress_threads,
|
||||||
bool enable_mpi_threads);
|
bool enable_mpi_threads);
|
||||||
|
|
||||||
|
|
||||||
OMPI_MODULE_DECLSPEC extern mca_mtl_base_component_2_0_0_t mca_mtl_portals4_component;
|
OMPI_MODULE_DECLSPEC extern mca_mtl_base_component_2_0_0_t mca_mtl_portals4_component;
|
||||||
|
|
||||||
mca_mtl_base_component_2_0_0_t mca_mtl_portals4_component = {
|
mca_mtl_base_component_2_0_0_t mca_mtl_portals4_component = {
|
||||||
@ -135,7 +136,8 @@ ompi_mtl_portals4_component_open(void)
|
|||||||
"Other");
|
"Other");
|
||||||
|
|
||||||
ompi_mtl_portals4.ni_h = PTL_INVALID_HANDLE;
|
ompi_mtl_portals4.ni_h = PTL_INVALID_HANDLE;
|
||||||
ompi_mtl_portals4.eq_h = PTL_INVALID_HANDLE;
|
ompi_mtl_portals4.send_eq_h = PTL_INVALID_HANDLE;
|
||||||
|
ompi_mtl_portals4.recv_eq_h = PTL_INVALID_HANDLE;
|
||||||
ompi_mtl_portals4.zero_md_h = PTL_INVALID_HANDLE;
|
ompi_mtl_portals4.zero_md_h = PTL_INVALID_HANDLE;
|
||||||
ompi_mtl_portals4.long_overflow_me_h = PTL_INVALID_HANDLE;
|
ompi_mtl_portals4.long_overflow_me_h = PTL_INVALID_HANDLE;
|
||||||
ompi_mtl_portals4.send_idx = (ptl_pt_index_t) ~0UL;
|
ompi_mtl_portals4.send_idx = (ptl_pt_index_t) ~0UL;
|
||||||
@ -208,7 +210,16 @@ ompi_mtl_portals4_component_init(bool enable_progress_threads,
|
|||||||
/* create event queue */
|
/* create event queue */
|
||||||
ret = PtlEQAlloc(ompi_mtl_portals4.ni_h,
|
ret = PtlEQAlloc(ompi_mtl_portals4.ni_h,
|
||||||
ompi_mtl_portals4.queue_size,
|
ompi_mtl_portals4.queue_size,
|
||||||
&ompi_mtl_portals4.eq_h);
|
&ompi_mtl_portals4.send_eq_h);
|
||||||
|
if (PTL_OK != ret) {
|
||||||
|
opal_output_verbose(1, ompi_mtl_base_output,
|
||||||
|
"%s:%d: PtlEQAlloc failed: %d\n",
|
||||||
|
__FILE__, __LINE__, ret);
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
ret = PtlEQAlloc(ompi_mtl_portals4.ni_h,
|
||||||
|
ompi_mtl_portals4.queue_size,
|
||||||
|
&ompi_mtl_portals4.recv_eq_h);
|
||||||
if (PTL_OK != ret) {
|
if (PTL_OK != ret) {
|
||||||
opal_output_verbose(1, ompi_mtl_base_output,
|
opal_output_verbose(1, ompi_mtl_base_output,
|
||||||
"%s:%d: PtlEQAlloc failed: %d\n",
|
"%s:%d: PtlEQAlloc failed: %d\n",
|
||||||
@ -218,8 +229,10 @@ ompi_mtl_portals4_component_init(bool enable_progress_threads,
|
|||||||
|
|
||||||
/* Create portal table entries */
|
/* Create portal table entries */
|
||||||
ret = PtlPTAlloc(ompi_mtl_portals4.ni_h,
|
ret = PtlPTAlloc(ompi_mtl_portals4.ni_h,
|
||||||
PTL_PT_ONLY_USE_ONCE | PTL_PT_FLOWCTRL,
|
PTL_PT_ONLY_USE_ONCE |
|
||||||
ompi_mtl_portals4.eq_h,
|
PTL_PT_ONLY_TRUNCATE |
|
||||||
|
PTL_PT_FLOWCTRL,
|
||||||
|
ompi_mtl_portals4.recv_eq_h,
|
||||||
REQ_SEND_TABLE_ID,
|
REQ_SEND_TABLE_ID,
|
||||||
&ompi_mtl_portals4.send_idx);
|
&ompi_mtl_portals4.send_idx);
|
||||||
if (PTL_OK != ret) {
|
if (PTL_OK != ret) {
|
||||||
@ -229,8 +242,9 @@ ompi_mtl_portals4_component_init(bool enable_progress_threads,
|
|||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
ret = PtlPTAlloc(ompi_mtl_portals4.ni_h,
|
ret = PtlPTAlloc(ompi_mtl_portals4.ni_h,
|
||||||
PTL_PT_ONLY_USE_ONCE,
|
PTL_PT_ONLY_USE_ONCE |
|
||||||
ompi_mtl_portals4.eq_h,
|
PTL_PT_ONLY_TRUNCATE,
|
||||||
|
ompi_mtl_portals4.send_eq_h,
|
||||||
REQ_READ_TABLE_ID,
|
REQ_READ_TABLE_ID,
|
||||||
&ompi_mtl_portals4.read_idx);
|
&ompi_mtl_portals4.read_idx);
|
||||||
if (PTL_OK != ret) {
|
if (PTL_OK != ret) {
|
||||||
@ -288,7 +302,7 @@ ompi_mtl_portals4_component_init(bool enable_progress_threads,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* attach short unex recv blocks */
|
/* attach short unex recv blocks */
|
||||||
ret = ompi_mtl_portals4_recv_short_init(&ompi_mtl_portals4);
|
ret = ompi_mtl_portals4_recv_short_init();
|
||||||
if (OMPI_SUCCESS != ret) {
|
if (OMPI_SUCCESS != ret) {
|
||||||
opal_output_verbose(1, ompi_mtl_base_output,
|
opal_output_verbose(1, ompi_mtl_base_output,
|
||||||
"%s:%d: short receive block initialization failed: %d\n",
|
"%s:%d: short receive block initialization failed: %d\n",
|
||||||
@ -325,8 +339,11 @@ ompi_mtl_portals4_component_init(bool enable_progress_threads,
|
|||||||
if (ompi_mtl_portals4.send_idx != (ptl_pt_index_t) ~0UL) {
|
if (ompi_mtl_portals4.send_idx != (ptl_pt_index_t) ~0UL) {
|
||||||
PtlPTFree(ompi_mtl_portals4.ni_h, ompi_mtl_portals4.send_idx);
|
PtlPTFree(ompi_mtl_portals4.ni_h, ompi_mtl_portals4.send_idx);
|
||||||
}
|
}
|
||||||
if (!PtlHandleIsEqual(ompi_mtl_portals4.eq_h, PTL_INVALID_HANDLE)) {
|
if (!PtlHandleIsEqual(ompi_mtl_portals4.send_eq_h, PTL_INVALID_HANDLE)) {
|
||||||
PtlEQFree(ompi_mtl_portals4.eq_h);
|
PtlEQFree(ompi_mtl_portals4.send_eq_h);
|
||||||
|
}
|
||||||
|
if (!PtlHandleIsEqual(ompi_mtl_portals4.recv_eq_h, PTL_INVALID_HANDLE)) {
|
||||||
|
PtlEQFree(ompi_mtl_portals4.recv_eq_h);
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -389,3 +406,86 @@ ompi_mtl_portals4_get_error(int ptl_error)
|
|||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
ompi_mtl_portals4_progress(void)
|
||||||
|
{
|
||||||
|
int count = 0, ret;
|
||||||
|
unsigned int which;
|
||||||
|
ptl_event_t ev;
|
||||||
|
ompi_mtl_portals4_base_request_t *ptl_request;
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
ret = PtlEQPoll(ompi_mtl_portals4.eqs_h, 2, 0, &ev, &which);
|
||||||
|
if (PTL_OK == ret) {
|
||||||
|
OPAL_OUTPUT_VERBOSE((60, ompi_mtl_base_output,
|
||||||
|
"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_REPLY:
|
||||||
|
case PTL_EVENT_SEND:
|
||||||
|
case PTL_EVENT_ACK:
|
||||||
|
case PTL_EVENT_AUTO_FREE:
|
||||||
|
case PTL_EVENT_AUTO_UNLINK:
|
||||||
|
case PTL_EVENT_SEARCH:
|
||||||
|
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_PT_DISABLED:
|
||||||
|
/* catch up by draining rest of the queue */
|
||||||
|
ompi_mtl_portals4_progress();
|
||||||
|
|
||||||
|
/* get restarted */
|
||||||
|
if (ompi_mtl_portals4.send_idx == ev.pt_index) {
|
||||||
|
/* make sure we have at least one active short receive block */
|
||||||
|
ret = ompi_mtl_portals4_recv_short_link(1);
|
||||||
|
if (OMPI_SUCCESS != ret) {
|
||||||
|
opal_output(ompi_mtl_base_output,
|
||||||
|
"Unable to post short receive block after flow control.");
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
ret = PtlPTEnable(ompi_mtl_portals4.ni_h,
|
||||||
|
ompi_mtl_portals4.send_idx);
|
||||||
|
if (PTL_OK != ret) {
|
||||||
|
opal_output_verbose(1, ompi_mtl_base_output,
|
||||||
|
"%s:%d: PtlPTEnable failed: %d\n",
|
||||||
|
__FILE__, __LINE__, ret);
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
opal_output(ompi_mtl_base_output, "Unhandled send flow control event.");
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case PTL_EVENT_LINK:
|
||||||
|
case PTL_EVENT_GET_OVERFLOW:
|
||||||
|
case PTL_EVENT_FETCH_ATOMIC:
|
||||||
|
case PTL_EVENT_FETCH_ATOMIC_OVERFLOW:
|
||||||
|
case PTL_EVENT_ATOMIC:
|
||||||
|
case PTL_EVENT_ATOMIC_OVERFLOW:
|
||||||
|
opal_output_verbose(1, ompi_mtl_base_output,
|
||||||
|
"Unexpected event of type %d", ev.type);
|
||||||
|
}
|
||||||
|
} else if (PTL_EQ_EMPTY == ret) {
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
opal_output(ompi_mtl_base_output,
|
||||||
|
"Error returned from PtlEQGet: %d", ret);
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
#include "mtl_portals4_recv_short.h"
|
#include "mtl_portals4_recv_short.h"
|
||||||
|
|
||||||
/* called when a receive should be progressed */
|
/* called when a receive should be progressed */
|
||||||
int
|
static int
|
||||||
ompi_mtl_portals4_recv_progress(ptl_event_t *ev,
|
ompi_mtl_portals4_recv_progress(ptl_event_t *ev,
|
||||||
ompi_mtl_portals4_base_request_t* ptl_base_request)
|
ompi_mtl_portals4_base_request_t* ptl_base_request)
|
||||||
{
|
{
|
||||||
@ -76,7 +76,7 @@ ompi_mtl_portals4_recv_progress(ptl_event_t *ev,
|
|||||||
md.length = ((msg_length > ptl_request->delivery_len) ?
|
md.length = ((msg_length > ptl_request->delivery_len) ?
|
||||||
ptl_request->delivery_len : msg_length) - ompi_mtl_portals4.eager_limit;
|
ptl_request->delivery_len : msg_length) - ompi_mtl_portals4.eager_limit;
|
||||||
md.options = 0;
|
md.options = 0;
|
||||||
md.eq_handle = ompi_mtl_portals4.eq_h;
|
md.eq_handle = ompi_mtl_portals4.recv_eq_h;
|
||||||
md.ct_handle = PTL_CT_NONE;
|
md.ct_handle = PTL_CT_NONE;
|
||||||
|
|
||||||
ret = PtlMDBind(ompi_mtl_portals4.ni_h,
|
ret = PtlMDBind(ompi_mtl_portals4.ni_h,
|
||||||
@ -253,7 +253,7 @@ ompi_mtl_portals4_recv_progress(ptl_event_t *ev,
|
|||||||
md.length = ((msg_length > ptl_request->delivery_len) ?
|
md.length = ((msg_length > ptl_request->delivery_len) ?
|
||||||
ptl_request->delivery_len : msg_length) - ev->mlength;
|
ptl_request->delivery_len : msg_length) - ev->mlength;
|
||||||
md.options = 0;
|
md.options = 0;
|
||||||
md.eq_handle = ompi_mtl_portals4.eq_h;
|
md.eq_handle = ompi_mtl_portals4.recv_eq_h;
|
||||||
md.ct_handle = PTL_CT_NONE;
|
md.ct_handle = PTL_CT_NONE;
|
||||||
|
|
||||||
ret = PtlMDBind(ompi_mtl_portals4.ni_h,
|
ret = PtlMDBind(ompi_mtl_portals4.ni_h,
|
||||||
|
@ -31,18 +31,30 @@ OBJ_CLASS_INSTANCE(ompi_mtl_portals4_recv_short_block_t,
|
|||||||
NULL, NULL);
|
NULL, NULL);
|
||||||
|
|
||||||
static inline int ompi_mtl_portals4_activate_block(ompi_mtl_portals4_recv_short_block_t *block);
|
static inline int ompi_mtl_portals4_activate_block(ompi_mtl_portals4_recv_short_block_t *block);
|
||||||
|
static int ompi_mtl_portals4_recv_short_block_free(ompi_mtl_portals4_recv_short_block_t *block);
|
||||||
|
|
||||||
static int
|
static int
|
||||||
ompi_mtl_portals4_recv_block_progress(ptl_event_t *ev,
|
ompi_mtl_portals4_recv_block_progress(ptl_event_t *ev,
|
||||||
ompi_mtl_portals4_base_request_t* ptl_base_request)
|
ompi_mtl_portals4_base_request_t* ptl_base_request)
|
||||||
{
|
{
|
||||||
|
int ret = OMPI_SUCCESS;
|
||||||
ompi_mtl_portals4_recv_short_request_t *ptl_request =
|
ompi_mtl_portals4_recv_short_request_t *ptl_request =
|
||||||
(ompi_mtl_portals4_recv_short_request_t*) ptl_base_request;
|
(ompi_mtl_portals4_recv_short_request_t*) ptl_base_request;
|
||||||
|
|
||||||
ompi_mtl_portals4_recv_short_block_t *block = ptl_request->block;
|
ompi_mtl_portals4_recv_short_block_t *block = ptl_request->block;
|
||||||
|
|
||||||
if (PTL_EVENT_AUTO_FREE == ev->type) {
|
if (PTL_EVENT_AUTO_FREE == ev->type) {
|
||||||
return ompi_mtl_portals4_activate_block(block);
|
if (block->release_on_free) {
|
||||||
|
opal_list_remove_item(&ompi_mtl_portals4.waiting_recv_short_blocks,
|
||||||
|
&block->base);
|
||||||
|
ret = ompi_mtl_portals4_recv_short_block_free(block);
|
||||||
|
} else {
|
||||||
|
ret = ompi_mtl_portals4_activate_block(block);
|
||||||
|
}
|
||||||
|
} else if (PTL_EVENT_AUTO_UNLINK == ev->type) {
|
||||||
|
opal_list_remove_item(&ompi_mtl_portals4.active_recv_short_blocks,
|
||||||
|
&block->base);
|
||||||
|
opal_list_append(&ompi_mtl_portals4.waiting_recv_short_blocks,
|
||||||
|
&block->base);
|
||||||
} else {
|
} else {
|
||||||
OPAL_OUTPUT_VERBOSE((50, ompi_mtl_base_output,
|
OPAL_OUTPUT_VERBOSE((50, ompi_mtl_base_output,
|
||||||
"OVERFLOW EVENT %d, hdr_data = %lx", ev->type, (long unsigned) ev->hdr_data));
|
"OVERFLOW EVENT %d, hdr_data = %lx", ev->type, (long unsigned) ev->hdr_data));
|
||||||
@ -51,26 +63,20 @@ ompi_mtl_portals4_recv_block_progress(ptl_event_t *ev,
|
|||||||
return OMPI_SUCCESS;
|
return OMPI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
|
||||||
ompi_mtl_portals4_recv_short_block_repost(ptl_event_t *ev)
|
|
||||||
{
|
|
||||||
return ompi_mtl_portals4_activate_block(ev->user_ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static ompi_mtl_portals4_recv_short_block_t*
|
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_alloc(bool release_on_free)
|
||||||
{
|
{
|
||||||
ompi_mtl_portals4_recv_short_block_t *block;
|
ompi_mtl_portals4_recv_short_block_t *block;
|
||||||
|
|
||||||
block = OBJ_NEW(ompi_mtl_portals4_recv_short_block_t);
|
block = OBJ_NEW(ompi_mtl_portals4_recv_short_block_t);
|
||||||
block->mtl = mtl;
|
block->start = malloc(ompi_mtl_portals4.recv_short_size);
|
||||||
block->start = malloc(mtl->recv_short_size);
|
|
||||||
if (block->start == NULL) return NULL;
|
if (block->start == NULL) return NULL;
|
||||||
|
|
||||||
block->me_h = PTL_INVALID_HANDLE;
|
block->me_h = PTL_INVALID_HANDLE;
|
||||||
block->request.block = block;
|
block->request.block = block;
|
||||||
block->request.super.event_callback = ompi_mtl_portals4_recv_block_progress;
|
block->request.super.event_callback = ompi_mtl_portals4_recv_block_progress;
|
||||||
|
block->release_on_free = release_on_free;
|
||||||
|
|
||||||
return block;
|
return block;
|
||||||
}
|
}
|
||||||
@ -103,20 +109,20 @@ ompi_mtl_portals4_activate_block(ompi_mtl_portals4_recv_short_block_t *block)
|
|||||||
ptl_me_t me;
|
ptl_me_t me;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
opal_list_remove_item(&ompi_mtl_portals4.waiting_recv_short_blocks, &block->base);
|
||||||
|
|
||||||
ignore_bits = MTL_PORTALS4_CONTEXT_MASK | MTL_PORTALS4_SOURCE_MASK | MTL_PORTALS4_TAG_MASK;
|
ignore_bits = MTL_PORTALS4_CONTEXT_MASK | MTL_PORTALS4_SOURCE_MASK | MTL_PORTALS4_TAG_MASK;
|
||||||
|
|
||||||
me.start = block->start;
|
me.start = block->start;
|
||||||
me.length = block->mtl->recv_short_size;
|
me.length = ompi_mtl_portals4.recv_short_size;
|
||||||
me.ct_handle = PTL_CT_NONE;
|
me.ct_handle = PTL_CT_NONE;
|
||||||
me.min_free = block->mtl->eager_limit;
|
me.min_free = ompi_mtl_portals4.eager_limit;
|
||||||
me.uid = PTL_UID_ANY;
|
me.uid = PTL_UID_ANY;
|
||||||
me.options =
|
me.options =
|
||||||
PTL_ME_OP_PUT |
|
PTL_ME_OP_PUT |
|
||||||
PTL_ME_EVENT_LINK_DISABLE |
|
PTL_ME_EVENT_LINK_DISABLE |
|
||||||
PTL_ME_MANAGE_LOCAL |
|
PTL_ME_MANAGE_LOCAL |
|
||||||
PTL_ME_NO_TRUNCATE |
|
|
||||||
PTL_ME_MAY_ALIGN |
|
PTL_ME_MAY_ALIGN |
|
||||||
PTL_ME_EVENT_UNLINK_DISABLE |
|
|
||||||
PTL_ME_ACK_DISABLE;
|
PTL_ME_ACK_DISABLE;
|
||||||
#if !OPAL_ENABLE_DEBUG
|
#if !OPAL_ENABLE_DEBUG
|
||||||
me.options |= PTL_ME_EVENT_COMM_DISABLE;
|
me.options |= PTL_ME_EVENT_COMM_DISABLE;
|
||||||
@ -126,32 +132,41 @@ ompi_mtl_portals4_activate_block(ompi_mtl_portals4_recv_short_block_t *block)
|
|||||||
me.match_bits = match_bits;
|
me.match_bits = match_bits;
|
||||||
me.ignore_bits = ignore_bits;
|
me.ignore_bits = ignore_bits;
|
||||||
|
|
||||||
ret = PtlMEAppend(block->mtl->ni_h,
|
ret = PtlMEAppend(ompi_mtl_portals4.ni_h,
|
||||||
ompi_mtl_portals4.send_idx,
|
ompi_mtl_portals4.send_idx,
|
||||||
&me,
|
&me,
|
||||||
PTL_OVERFLOW_LIST,
|
PTL_OVERFLOW_LIST,
|
||||||
&block->request,
|
&block->request,
|
||||||
&block->me_h);
|
&block->me_h);
|
||||||
return (ret == PTL_OK) ? OMPI_SUCCESS : ompi_mtl_portals4_get_error(ret);
|
if (ret == PTL_OK) {
|
||||||
|
ret = OMPI_SUCCESS;
|
||||||
|
opal_list_append(&ompi_mtl_portals4.active_recv_short_blocks,
|
||||||
|
&block->base);
|
||||||
|
} else {
|
||||||
|
ret = ompi_mtl_portals4_get_error(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
ompi_mtl_portals4_recv_short_init(mca_mtl_portals4_module_t *mtl)
|
ompi_mtl_portals4_recv_short_init(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
OBJ_CONSTRUCT(&(mtl->recv_short_blocks), opal_list_t);
|
OBJ_CONSTRUCT(&(ompi_mtl_portals4.active_recv_short_blocks), opal_list_t);
|
||||||
|
OBJ_CONSTRUCT(&(ompi_mtl_portals4.waiting_recv_short_blocks), opal_list_t);
|
||||||
|
|
||||||
/* create the recv blocks */
|
/* create the recv blocks */
|
||||||
for (i = 0 ; i < mtl->recv_short_num ; ++i) {
|
for (i = 0 ; i < ompi_mtl_portals4.recv_short_num ; ++i) {
|
||||||
ompi_mtl_portals4_recv_short_block_t *block =
|
ompi_mtl_portals4_recv_short_block_t *block =
|
||||||
ompi_mtl_portals4_recv_short_block_init(mtl);
|
ompi_mtl_portals4_recv_short_block_alloc(false);
|
||||||
if (NULL == block) {
|
if (NULL == block) {
|
||||||
return OMPI_ERR_OUT_OF_RESOURCE;
|
return OMPI_ERR_OUT_OF_RESOURCE;
|
||||||
}
|
}
|
||||||
opal_list_append(&(mtl->recv_short_blocks),
|
opal_list_append(&ompi_mtl_portals4.waiting_recv_short_blocks,
|
||||||
(opal_list_item_t*) block);
|
&block->base);
|
||||||
ompi_mtl_portals4_activate_block(block);
|
ompi_mtl_portals4_activate_block(block);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -160,11 +175,16 @@ ompi_mtl_portals4_recv_short_init(mca_mtl_portals4_module_t *mtl)
|
|||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
ompi_mtl_portals4_recv_short_fini(mca_mtl_portals4_module_t *mtl)
|
ompi_mtl_portals4_recv_short_fini(void)
|
||||||
{
|
{
|
||||||
opal_list_item_t *item;
|
opal_list_item_t *item;
|
||||||
|
|
||||||
while (NULL != (item = opal_list_remove_first(&mtl->recv_short_blocks))) {
|
while (NULL != (item = opal_list_remove_first(&ompi_mtl_portals4.active_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);
|
||||||
|
}
|
||||||
|
while (NULL != (item = opal_list_remove_first(&ompi_mtl_portals4.waiting_recv_short_blocks))) {
|
||||||
ompi_mtl_portals4_recv_short_block_t *block =
|
ompi_mtl_portals4_recv_short_block_t *block =
|
||||||
(ompi_mtl_portals4_recv_short_block_t*) item;
|
(ompi_mtl_portals4_recv_short_block_t*) item;
|
||||||
ompi_mtl_portals4_recv_short_block_free(block);
|
ompi_mtl_portals4_recv_short_block_free(block);
|
||||||
@ -174,3 +194,24 @@ ompi_mtl_portals4_recv_short_fini(mca_mtl_portals4_module_t *mtl)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
ompi_mtl_portals4_recv_short_link(int count)
|
||||||
|
{
|
||||||
|
int active = opal_list_get_size(&ompi_mtl_portals4.active_recv_short_blocks);
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (active < count) {
|
||||||
|
for (i = 0 ; i < (count - active) ; ++i) {
|
||||||
|
ompi_mtl_portals4_recv_short_block_t *block =
|
||||||
|
ompi_mtl_portals4_recv_short_block_alloc(false);
|
||||||
|
if (NULL == block) {
|
||||||
|
return OMPI_ERR_OUT_OF_RESOURCE;
|
||||||
|
}
|
||||||
|
opal_list_append(&ompi_mtl_portals4.waiting_recv_short_blocks,
|
||||||
|
&block->base);
|
||||||
|
ompi_mtl_portals4_activate_block(block);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return OMPI_SUCCESS;
|
||||||
|
}
|
||||||
|
@ -22,25 +22,21 @@
|
|||||||
|
|
||||||
struct ompi_mtl_portals4_recv_short_block_t {
|
struct ompi_mtl_portals4_recv_short_block_t {
|
||||||
opal_list_item_t base;
|
opal_list_item_t base;
|
||||||
mca_mtl_portals4_module_t *mtl;
|
|
||||||
void *start;
|
void *start;
|
||||||
ptl_handle_me_t me_h;
|
ptl_handle_me_t me_h;
|
||||||
struct ompi_mtl_portals4_recv_short_request_t request;
|
struct ompi_mtl_portals4_recv_short_request_t request;
|
||||||
|
bool release_on_free;
|
||||||
};
|
};
|
||||||
typedef struct ompi_mtl_portals4_recv_short_block_t ompi_mtl_portals4_recv_short_block_t;
|
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);
|
OBJ_CLASS_DECLARATION(ompi_mtl_portals4_recv_short_block_t);
|
||||||
|
|
||||||
extern int
|
/* initialize and post short receive blocks */
|
||||||
ompi_mtl_portals4_recv_short_init(mca_mtl_portals4_module_t *mtl);
|
extern int ompi_mtl_portals4_recv_short_init(void);
|
||||||
|
|
||||||
extern int
|
/* clean up all short receive blocks */
|
||||||
ompi_mtl_portals4_recv_short_fini(mca_mtl_portals4_module_t *mtl);
|
extern int ompi_mtl_portals4_recv_short_fini(void);
|
||||||
|
|
||||||
extern int
|
/* ensure that there's at least N short receive blocks linked */
|
||||||
ompi_mtl_portals4_recv_short_block_repost(ptl_event_t *ev);
|
extern int ompi_mtl_portals4_recv_short_link(int count);
|
||||||
|
|
||||||
extern int
|
|
||||||
ompi_mtl_portals4_recv_progress(ptl_event_t *ev,
|
|
||||||
ompi_mtl_portals4_base_request_t* ptl_request);
|
|
||||||
|
|
||||||
#endif /* OMPI_MTL_PORTALS_RECV_SHORT_H */
|
#endif /* OMPI_MTL_PORTALS_RECV_SHORT_H */
|
||||||
|
@ -108,7 +108,7 @@ ompi_mtl_portals4_short_isend(mca_pml_base_send_mode_t mode,
|
|||||||
md.start = start;
|
md.start = start;
|
||||||
md.length = length;
|
md.length = length;
|
||||||
md.options = 0;
|
md.options = 0;
|
||||||
md.eq_handle = ompi_mtl_portals4.eq_h;
|
md.eq_handle = ompi_mtl_portals4.send_eq_h;
|
||||||
md.ct_handle = PTL_CT_NONE;
|
md.ct_handle = PTL_CT_NONE;
|
||||||
|
|
||||||
ret = PtlMDBind(ompi_mtl_portals4.ni_h,
|
ret = PtlMDBind(ompi_mtl_portals4.ni_h,
|
||||||
@ -169,7 +169,7 @@ ompi_mtl_portals4_sync_isend(void *start, int length, int contextid, int tag,
|
|||||||
md.start = start;
|
md.start = start;
|
||||||
md.length = length;
|
md.length = length;
|
||||||
md.options = 0;
|
md.options = 0;
|
||||||
md.eq_handle = ompi_mtl_portals4.eq_h;
|
md.eq_handle = ompi_mtl_portals4.send_eq_h;
|
||||||
md.ct_handle = PTL_CT_NONE;
|
md.ct_handle = PTL_CT_NONE;
|
||||||
|
|
||||||
ret = PtlMDBind(ompi_mtl_portals4.ni_h,
|
ret = PtlMDBind(ompi_mtl_portals4.ni_h,
|
||||||
@ -259,7 +259,7 @@ ompi_mtl_portals4_long_isend(void *start, int length, int contextid, int tag,
|
|||||||
md.start = start;
|
md.start = start;
|
||||||
md.length = length;
|
md.length = length;
|
||||||
md.options = 0;
|
md.options = 0;
|
||||||
md.eq_handle = ompi_mtl_portals4.eq_h;
|
md.eq_handle = ompi_mtl_portals4.send_eq_h;
|
||||||
md.ct_handle = PTL_CT_NONE;
|
md.ct_handle = PTL_CT_NONE;
|
||||||
|
|
||||||
ret = PtlMDBind(ompi_mtl_portals4.ni_h,
|
ret = PtlMDBind(ompi_mtl_portals4.ni_h,
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user