PULSAR  0.1
Parallel Unified Linear Algebra with Systolic Arrays
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros
prt_request.c File Reference

PRT communication request implementation. More...

#include "prt_request.h"
Include dependency graph for prt_request.c:

Go to the source code of this file.

Functions

prt_request_tprt_request_new (prt_packet_t *packet, int count, MPI_Datatype datatype, int peer, int tag)
 request constructor More...
 
void prt_request_destroy (prt_request_t *request)
 request destructor Request is only an envelope for a packet. Request destruction does not affect the packet. Need be, packet is destroyed separately (e.g. send completion). More...
 
void prt_request_send (prt_request_t *request)
 Post a send request. Detects a possible overflow of the request size. More...
 
void prt_request_recv (prt_request_t *request)
 Post a receive request. Detects a possible overflow of the request size. More...
 
int prt_request_test (prt_request_t *request)
 Test a request. Trace only completed requests. More...
 
void prt_request_cancel (prt_request_t *request)
 Cancel a request. Cancel the request, release the packet, free the request object. More...
 

Detailed Description

PRT communication request implementation.

Author
Jakub Kurzak

PULSAR Runtime /pulsar/ Copyright (C) 2012-2013 University of Tennessee.

Definition in file prt_request.c.

Function Documentation

void prt_request_cancel ( prt_request_t request)

Cancel a request. Cancel the request, release the packet, free the request object.

Parameters
request

Definition at line 150 of file prt_request.c.

References prt_request_s::packet, prt_assert, prt_packet_release(), and prt_request_s::request.

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_Request request
Definition: prt_request.h:33
struct prt_packet_s * packet
Definition: prt_request.h:28
#define prt_assert(cond, msg)
Definition: prt_assert.h:30
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

Here is the call graph for this function:

Here is the caller graph for this function:

void prt_request_destroy ( prt_request_t request)

request destructor Request is only an envelope for a packet. Request destruction does not affect the packet. Need be, packet is destroyed separately (e.g. send completion).

Parameters
request

Definition at line 48 of file prt_request.c.

49 {
50  free(request);
51 }

Here is the caller graph for this function:

prt_request_t* prt_request_new ( prt_packet_t packet,
int  count,
MPI_Datatype  datatype,
int  peer,
int  tag 
)

request constructor

Parameters
packet
count
datatype
peer
tag
Returns
new request

Definition at line 25 of file prt_request.c.

References prt_request_s::count, prt_request_s::datatype, prt_request_s::packet, prt_request_s::peer, prt_assert, and prt_request_s::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 }
MPI_Datatype datatype
Definition: prt_request.h:30
struct prt_packet_s * packet
Definition: prt_request.h:28
#define prt_assert(cond, msg)
Definition: prt_assert.h:30
VSA proxy's communication request Contains basic information about the communication request...
Definition: prt_request.h:27

Here is the caller graph for this function:

void prt_request_recv ( prt_request_t request)

Post a receive request. Detects a possible overflow of the request size.

Parameters
request

Definition at line 92 of file prt_request.c.

References prt_request_s::count, prt_packet_s::data, prt_request_s::datatype, OliveDrab, prt_request_s::packet, prt_request_s::peer, prt_assert, prt_request_s::request, svg_trace_start(), svg_trace_stop(), and prt_request_s::tag.

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 }
MPI_Datatype datatype
Definition: prt_request.h:30
MPI_Request request
Definition: prt_request.h:33
void * data
Definition: prt_packet.h:25
void svg_trace_start(int thread_rank)
Start tracing an event.
Definition: svg_trace.c:50
struct prt_packet_s * packet
Definition: prt_request.h:28
#define prt_assert(cond, msg)
Definition: prt_assert.h:30
void svg_trace_stop(int thread_rank, int color)
Stop tracing an event.
Definition: svg_trace.c:63

Here is the call graph for this function:

Here is the caller graph for this function:

void prt_request_send ( prt_request_t request)

Post a send request. Detects a possible overflow of the request size.

Parameters
request

Definition at line 60 of file prt_request.c.

References prt_request_s::count, DarkKhaki, prt_packet_s::data, prt_request_s::datatype, prt_request_s::packet, prt_request_s::peer, prt_assert, prt_request_s::request, svg_trace_start(), svg_trace_stop(), and prt_request_s::tag.

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 }
MPI_Datatype datatype
Definition: prt_request.h:30
MPI_Request request
Definition: prt_request.h:33
void * data
Definition: prt_packet.h:25
void svg_trace_start(int thread_rank)
Start tracing an event.
Definition: svg_trace.c:50
struct prt_packet_s * packet
Definition: prt_request.h:28
#define prt_assert(cond, msg)
Definition: prt_assert.h:30
void svg_trace_stop(int thread_rank, int color)
Stop tracing an event.
Definition: svg_trace.c:63

Here is the call graph for this function:

Here is the caller graph for this function:

int prt_request_test ( prt_request_t request)

Test a request. Trace only completed requests.

Parameters
request
Return values
0Operation pending.
1Operation completed.

Definition at line 127 of file prt_request.c.

References prt_assert, prt_request_s::request, RosyBrown, prt_request_s::status, svg_trace_start(), and svg_trace_stop().

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 }
MPI_Status status
Definition: prt_request.h:34
MPI_Request request
Definition: prt_request.h:33
void svg_trace_start(int thread_rank)
Start tracing an event.
Definition: svg_trace.c:50
#define prt_assert(cond, msg)
Definition: prt_assert.h:30
void svg_trace_stop(int thread_rank, int color)
Stop tracing an event.
Definition: svg_trace.c:63

Here is the call graph for this function:

Here is the caller graph for this function: