PULSAR  0.1
Parallel Unified Linear Algebra with Systolic Arrays
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros
prt_request.c
Go to the documentation of this file.
1 
11 #include "prt_request.h"
12 
14 
26  prt_packet_t *packet, int count,
27  MPI_Datatype datatype, int peer, int tag)
28 {
29  prt_request_t *request = (prt_request_t*)malloc(sizeof(prt_request_t));
30  prt_assert(request != NULL, "malloc failed");
31  request->packet = packet;
32  request->count = count;
33  request->datatype = datatype;
34  request->peer = peer;
35  request->tag = tag;
36  return request;
37 }
38 
40 
49 {
50  free(request);
51 }
52 
54 
61 {
62  int retval;
63  int type_size;
64  long request_size;
65 
66  // Compute type size. Check for overflow.
67  MPI_Type_size(request->datatype, &type_size);
68  request_size = (long)request->count*type_size;
69  prt_assert(request_size <= INT_MAX, "request size overflow");
70 
71  // Post and trace the request. Check the status.
72  svg_trace_start(0);
73  retval = MPI_Isend(
74  request->packet->data,
75  request->count*type_size,
76  MPI_BYTE,
77  request->peer,
78  request->tag,
79  MPI_COMM_WORLD,
80  &request->request);
82  prt_assert(retval == MPI_SUCCESS, "error in MPI_Isend");
83 }
84 
86 
93 {
94  int retval;
95  int type_size;
96  long request_size;
97 
98  // Compute type size. Check for overflow.
99  MPI_Type_size(request->datatype, &type_size);
100  request_size = (long)request->count*type_size;
101  prt_assert(request_size <= INT_MAX, "request size overflow");
102 
103  // Post and trace the request. Check the status.
104  svg_trace_start(0);
105  retval = MPI_Irecv(
106  request->packet->data,
107  request->count*type_size,
108  MPI_BYTE,
109  request->peer,
110  request->tag,
111  MPI_COMM_WORLD,
112  &request->request);
114  prt_assert(retval == MPI_SUCCESS, "error in MPI_Isend");
115 }
116 
118 
128 {
129  int flag;
130  int retval;
131 
132  // Test the request.
133  // Check the status.
134  // Trace if completed.
135  svg_trace_start(0);
136  retval = MPI_Test(&request->request, &flag, &request->status);
137  if (flag == 1)
139  prt_assert(retval == MPI_SUCCESS, "error in MPI_Test");
140  return flag;
141 }
142 
144 
151 {
152  int retval;
153  // Cancel the request.
154  retval = MPI_Cancel(&request->request);
155  prt_assert(retval == MPI_SUCCESS, "error in MPI_Cancel");
156 
157  // Release the packet.
158  prt_packet_release(request->packet);
159 
160  // Free the request.
161  free(request);
162 }
MPI_Datatype datatype
Definition: prt_request.h:30
MPI_Status status
Definition: prt_request.h:34
void prt_request_send(prt_request_t *request)
Post a send request. Detects a possible overflow of the request size.
Definition: prt_request.c:60
MPI_Request request
Definition: prt_request.h:33
void prt_request_cancel(prt_request_t *request)
Cancel a request. Cancel the request, release the packet, free the request object.
Definition: prt_request.c:150
VDP&#39;s data packet A packet of data transferred through VDP&#39;s channels.
Definition: prt_packet.h:24
prt_request_t * prt_request_new(prt_packet_t *packet, int count, MPI_Datatype datatype, int peer, int tag)
request constructor
Definition: prt_request.c:25
void * data
Definition: prt_packet.h:25
void svg_trace_start(int thread_rank)
Start tracing an event.
Definition: svg_trace.c:50
int prt_request_test(prt_request_t *request)
Test a request. Trace only completed requests.
Definition: prt_request.c:127
PRT communication request.
struct prt_packet_s * packet
Definition: prt_request.h:28
#define prt_assert(cond, msg)
Definition: prt_assert.h:30
void prt_request_destroy(prt_request_t *request)
request destructor Request is only an envelope for a packet. Request destruction does not affect the ...
Definition: prt_request.c:48
void svg_trace_stop(int thread_rank, int color)
Stop tracing an event.
Definition: svg_trace.c:63
void prt_request_recv(prt_request_t *request)
Post a receive request. Detects a possible overflow of the request size.
Definition: prt_request.c:92
VSA proxy&#39;s communication request Contains basic information about the communication request...
Definition: prt_request.h:27
void prt_packet_release(prt_packet_t *packet)
Release a packet. Decrements the number of active references. Destroys the packet when the last refer...
Definition: prt_packet.c:42