PULSAR  2.0.0
Parallel Ultra-Light Systolic Array Runtime
 All Data Structures Files Functions Typedefs Enumerations Macros Groups
prt_callback.c
Go to the documentation of this file.
1 
11 #include "prt_callback.h"
12 
14 
25  struct prt_packet_s *src_packet,
26  struct prt_packet_s *dst_packet,
27  struct prt_channel_s *channel)
28 {
29  prt_callback_finish_t *callback =
31  prt_assert(callback != NULL, "malloc failed");
32  callback->src_packet = src_packet;
33  callback->dst_packet = dst_packet;
34  callback->channel = channel;
35  return callback;
36 }
37 
39 
46 {
47  free(callback);
48 }
49 
51 
61  cudaStream_t stream, cudaError_t status, void *clbck)
62 {
63  // Cast the void pointer to the callback data.
64  prt_callback_finish_t *callback = (prt_callback_finish_t*)clbck;
65 
66  // Put the destination packet in the channel.
67  icl_deque_append(callback->channel->packets, (void*)callback->dst_packet);
68 
69  // Check for NULL packet.
70  // (dev -> same device communication).
71  if (callback->src_packet != NULL) {
72  if (callback->src_packet->location == PRT_LOCATION_HOST) {
73  prt_packet_release_host(callback->src_packet);
74  }
75  else {
76  // Create a packet release request.
77  prt_transfer_t *transfer =
79  callback->src_packet, NULL, PRT_DEVICE_PACKET_RELEASE, -1);
80  // Queue the packet release request.
82  callback->channel->proxy->transfers, (void*)transfer);
83  }
84  }
85  // Decrement the number of pending callbacks.
86  __sync_fetch_and_sub(&callback->channel->proxy->num_callbacks, 1);
87 
88  // Delete the callback data structure.
90 }
91 
93 
105  struct prt_packet_s *old_packet,
106  struct prt_packet_s *src_packet,
107  struct prt_channel_s *channel,
108  prt_direction_t direction,
109  int agent)
110 {
111  prt_callback_queue_t *callback =
112  (prt_callback_queue_t*)malloc(sizeof(prt_callback_queue_t));
113  prt_assert(callback != NULL, "malloc failed");
114  callback->old_packet = old_packet;
115  callback->src_packet = src_packet;
116  callback->channel = channel;
117  callback->direction = direction;
118  callback->agent = agent;
119  return callback;
120 }
121 
123 
130 {
131  free(callback);
132 }
133 
135 
144  cudaStream_t stream, cudaError_t status, void *clbck)
145 {
146  // Cast the void pointer to the callback data.
147  prt_callback_queue_t *callback = (prt_callback_queue_t*)clbck;
148 
149  // Initialize the local transfer request.
150  prt_transfer_t *transfer =
152  callback->src_packet,
153  callback->channel,
154  callback->direction,
155  callback->agent);
156  // Queue the local transfer request.
157  icl_deque_append(callback->channel->proxy->transfers, (void*)transfer);
158 
159  // IF old_packet not NULL.
160  if (callback->old_packet != NULL) {
161  if (callback->old_packet->location == PRT_LOCATION_HOST) {
162  prt_packet_release_host(callback->old_packet);
163  }
164  else {
165  // Create a packet release request.
166  prt_transfer_t *transfer =
168  callback->old_packet, NULL, PRT_DEVICE_PACKET_RELEASE, -1);
169  // Queue the packet release request.
171  callback->channel->proxy->transfers, (void*)transfer);
172  }
173  }
174  // Decrement the number of pending callbacks.
175  __sync_fetch_and_sub(&callback->channel->proxy->num_callbacks, 1);
176 
177  // Delete the callback data structure.
178  prt_callback_queue_delete(callback);
179 }
180 
182 
192  struct prt_vdp_s *vdp,
193  struct prt_packet_s *packet)
194 {
195  prt_callback_release_t *callback =
197  prt_assert(callback != NULL, "malloc failed");
198  callback->vdp = vdp;
199  callback->packet = packet;
200  return callback;
201 }
202 
204 
211 {
212  free(callback);
213 }
214 
216 
224  cudaStream_t stream, cudaError_t status, void *clbck)
225 {
226  // Cast the void pointer to the callback data.
228 
229  // Create the packet release request.
230  prt_transfer_t *transfer =
232  callback->packet, NULL, PRT_DEVICE_PACKET_RELEASE, -1);
233  // Queue the packet release request.
234  icl_deque_append(callback->vdp->vsa->proxy->transfers, (void*)transfer);
235 
236  // Decrement the number of pending callbacks.
237  __sync_fetch_and_sub(&callback->vdp->vsa->proxy->num_callbacks, 1);
238 
239  // Delete the callback data structure.
240  prt_callback_release_delete(callback);
241 }