This source file includes following definitions.
- ompi_mtl_psm2_iprobe
- ompi_mtl_psm2_improbe
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 #include "ompi_config.h"
24 #include "mtl_psm2.h"
25 #include "mtl_psm2_types.h"
26 #include "psm2.h"
27 #include "ompi/communicator/communicator.h"
28 #include "ompi/message/message.h"
29
30
31 int ompi_mtl_psm2_iprobe(struct mca_mtl_base_module_t* mtl,
32 struct ompi_communicator_t *comm,
33 int src,
34 int tag,
35 int *flag,
36 struct ompi_status_public_t *status)
37 {
38 psm2_mq_tag_t mqtag, tagsel;
39 psm2_mq_status2_t mqstat;
40 psm2_error_t err;
41
42 PSM2_MAKE_TAGSEL(src, tag, comm->c_contextid, mqtag, tagsel);
43
44 err = psm2_mq_iprobe2(ompi_mtl_psm2.mq,
45 PSM2_MQ_ANY_ADDR, &mqtag, &tagsel, &mqstat);
46 if (err == PSM2_OK) {
47 *flag = 1;
48 if(MPI_STATUS_IGNORE != status) {
49 status->MPI_SOURCE = mqstat.msg_tag.tag1;
50 status->MPI_TAG = mqstat.msg_tag.tag0;
51 status->_ucount = mqstat.nbytes;
52
53 switch (mqstat.error_code) {
54 case PSM2_OK:
55 status->MPI_ERROR = OMPI_SUCCESS;
56 break;
57 case PSM2_MQ_TRUNCATION:
58 status->MPI_ERROR = MPI_ERR_TRUNCATE;
59 break;
60 default:
61 status->MPI_ERROR = MPI_ERR_INTERN;
62 }
63 }
64
65 return OMPI_SUCCESS;
66 }
67 else if (err == PSM2_MQ_INCOMPLETE) {
68 *flag = 0;
69 return OMPI_SUCCESS;
70 }
71 else
72 return OMPI_ERROR;
73 }
74
75
76 int
77 ompi_mtl_psm2_improbe(struct mca_mtl_base_module_t *mtl,
78 struct ompi_communicator_t *comm,
79 int src,
80 int tag,
81 int *matched,
82 struct ompi_message_t **message,
83 struct ompi_status_public_t *status)
84 {
85 struct ompi_message_t* msg;
86 psm2_mq_tag_t mqtag, tagsel;
87 psm2_mq_status2_t mqstat;
88 psm2_mq_req_t mqreq;
89 psm2_error_t err;
90
91 PSM2_MAKE_TAGSEL(src, tag, comm->c_contextid, mqtag, tagsel);
92
93 err = psm2_mq_improbe2(ompi_mtl_psm2.mq,
94 PSM2_MQ_ANY_ADDR, &mqtag, &tagsel, &mqreq, &mqstat);
95 if (err == PSM2_OK) {
96
97 if(MPI_STATUS_IGNORE != status) {
98 status->MPI_SOURCE = mqstat.msg_tag.tag1;
99 status->MPI_TAG = mqstat.msg_tag.tag0;
100 status->_ucount = mqstat.nbytes;
101
102 switch (mqstat.error_code) {
103 case PSM2_OK:
104 status->MPI_ERROR = OMPI_SUCCESS;
105 break;
106 case PSM2_MQ_TRUNCATION:
107 status->MPI_ERROR = MPI_ERR_TRUNCATE;
108 break;
109 default:
110 status->MPI_ERROR = MPI_ERR_INTERN;
111 }
112 }
113
114 msg = ompi_message_alloc();
115 if(NULL == msg) {
116 return OMPI_ERR_OUT_OF_RESOURCE;
117 }
118
119 msg->comm = comm;
120 msg->req_ptr = mqreq;
121 msg->peer = mqstat.msg_tag.tag1;
122 msg->count = mqstat.nbytes;
123
124 *message = msg;
125 *matched = 1;
126 return OMPI_SUCCESS;
127 } else if(err == PSM2_MQ_INCOMPLETE) {
128 *matched = 0;
129 *message = MPI_MESSAGE_NULL;
130 return OMPI_SUCCESS;
131 } else {
132 return OMPI_ERROR;
133 }
134 }