Arax -8d09c51940345c86062e8ef2427c705ae66e5926
A Runtime Framework for Decoupling Applications from Heterogeneous Accelerators
Loading...
Searching...
No Matches
arax_data.c
Go to the documentation of this file.
1#include "arax_data.h"
2#include "arax_task.h"
3#include "arax_data_private.h"
4#include "arax_pipe.h"
5#include "arax_ptr.h"
6#include <string.h>
7#include <stdlib.h>
8#include "utils/system.h"
9
10// #define printd(...) fprintf(__VA_ARGS__)
11#define printd(...)
12
13#define VDFLAG(DATA, FLAG) (DATA->flags & FLAG)// ((size_t*)BUFF-1) same pointer arithmetics//
14#define VD_BUFF_OWNER(BUFF) *(arax_data_s **) ((char *) BUFF - sizeof(size_t *))
15
17{
18 return arax_data_init_aligned(vpipe, size, 1);
19} /* arax_data_init */
20
22{
23 arax_data_s *data;
24 size_t alloc_size = sizeof(arax_data_s) + ARAX_BUFF_ALLOC_SIZE(size, align);
25
26 arax_assert(align);
27
28 data = (arax_data_s *) arax_object_register(&(vpipe->objs),
30 "UNUSED", alloc_size, 1);
31
32 if (!data) // GCOV_EXCL_LINE
33 return 0; // GCOV_EXCL_LINE
34
35 uint64_t *buff_ptr = (uint64_t *) (data + 1); // Skip the struct
36
37 buff_ptr++; // Skip a back_pointer
38 buff_ptr = (uint64_t *) (((char *) buff_ptr) + align - (((size_t) buff_ptr) % align));// Align ptr;
39 arax_data_s **back_pointer = (arax_data_s **) (buff_ptr - 1);
40
41 *back_pointer = data;
42
43 data->size = size;
44 data->buffer = buff_ptr;
45 data->align = align;
46 data->flags = 0;
47 data->phys = 0; // required for migration
48
49 return data;
50} /* arax_data_init_aligned */
51
52void arax_data_get(arax_data *data, void *user)
53{
54 arax_proc_s *get_proc = arax_proc_get(__func__);
55
57 arax_data_s *vd = (arax_data_s *) data;
58
59 arax_assert(vd->accel);
60
61 // We must wait all previous operations to complete to ensure we get
62 // up to date data.Also have to synchronize data up to shm.
63
64 arax_task_msg_s *task = arax_task_issue(vd->accel, get_proc, 0, arax_data_size(data), 0, 0, 1, &data);
65
67
68 memcpy(user, arax_task_host_data(task, arax_data_size(vd)), arax_data_size(vd));
69
70 arax_task_free(task);
71
72 arax_proc_put(get_proc);
73}
74
75void arax_data_set(arax_data *data, arax_accel *accel, const void *user)
76{
77 arax_proc_s *set_proc = arax_proc_get(__func__);
78
80 arax_data_s *vd = (arax_data_s *) data;
81
82 // If already submitted to a vac, it should be at the same
83 arax_assert( (!(vd->accel)) || (vd->accel == accel) );
84 if (vd->accel == 0)
86 vd->accel = accel;
87
88 size_t size = arax_data_size(vd);
89
90 arax_task_issue(accel, set_proc, (void *) user, size, 0, 0, 1, &data);
91
92 arax_proc_put(set_proc);
93}
94
95void arax_data_memcpy(arax_accel *accel, arax_data_s *dst, arax_data_s *src, int block)
96{
99
100 if (dst == src)
101 return;
102
103 if (arax_data_size(dst) != arax_data_size(src)) {
104 fprintf(stderr, "%s(%p,%p): Size mismatch (%lu,%lu)\n", __func__, dst, src, arax_data_size(dst),
105 arax_data_size(src));
106 arax_assert(!"Size mismatch");
107 }
108 fprintf(stderr, "%s(%p,%p)[%lu,%lu]\n", __func__, dst, src, dst->flags, src->flags);
109
110 arax_data_get(src, 0);
111
112 arax_data_set(dst, accel, arax_data_deref(src));
113}
114
115#define TYPE_MASK(A, B) ( ( (A) *ARAX_TYPE_COUNT ) + (B) )
116
118{
120 arax_assert(accel); // Must be given a valid accelerator
121
122 if (data->accel == accel) // Already assigned to accel - nop
123 return;
124
125 if (!data->accel) { // Unassinged data - assign and increase accel
126 arax_assert(!data->remote); // How can you have a remote ptr, with no accel?
128 data->accel = accel;
129 return;
130 }
131
132 arax_object_type_e data_accel_type = ((arax_object_s *) (data->accel))->type;
133 arax_object_type_e accel_accel_type = ((arax_object_s *) (accel))->type;
134
135 switch (TYPE_MASK(data_accel_type, accel_accel_type) ) {
137 arax_vaccel_s *dvac = (arax_vaccel_s *) (data->accel);
138 arax_vaccel_s *avac = (arax_vaccel_s *) (accel);
139 if (dvac->phys == avac->phys) { // Both use the same physical accel - just migrate ref counts
142 data->accel = accel;
143 return;
144 } else { // Device 2 Device migration - migrate data and ref counts
145 fprintf(stderr, "Different device data migration!\n");
146 arax_assert(!"arax_data_migrate_accel: D2D not implemented!");
147 }
148 }
149 break;
150 default: {
151 fprintf(stderr, "%s():Data migration not implemented(%s:%s,%s:%s)!\n",
152 __func__,
153 arax_object_type_to_str(data_accel_type), ((arax_object_s *) (data->accel))->name,
154 arax_object_type_to_str(accel_accel_type), ((arax_object_s *) (accel))->name
155 );
156 arax_assert(!"No migration possible");
157 }
158 break;
159 }
160} /* arax_data_migrate_accel */
161
163{
166
167 if ( ((arax_vaccel_s *) accel)->type == CPU)
168 return; // CPU does not have a 'remote', so nothing to do
169
170 if (data->remote) {
171 arax_assert(data->accel); // Allocate remote must have accel
172 return; // Nothing left to do
173 }
174
175 if (!accel) {
177 data->accel = accel;
178 }
179
180 ARAX_THROTTLE_DEBUG_PRINT("%s(%p) - start\n", __func__, data);
181
182 arax_proc_s *alloc_data = arax_proc_get("alloc_data");
183 arax_task_msg_s *task = arax_task_issue(accel, alloc_data, 0, 0, 0, 0, 1, (arax_data **) &data);
184
186 arax_task_free(task);
187 arax_assert(data->remote); // Ensure remote was allocated
188
189 arax_assert(data->accel == accel);
190
191 arax_accel_size_dec(((arax_vaccel_s *) accel)->phys, arax_data_size(data));
192 ARAX_THROTTLE_DEBUG_PRINT("%s(%p) - end\n", __func__, data);
193}
194
196{
199
200 if (data->accel != accel) {
201 data->accel = accel;
202 arax_object_ref_inc(accel);
203 }
204}
205
206void arax_data_set_remote(arax_data_s *data, arax_accel *accel, void *remt)
207{
210 arax_assert(((arax_vaccel_s *) accel)->type != CPU);
211 arax_assert(data->accel == 0);
212 arax_assert(data->remote == 0);
213
215 data->accel = accel;
216 data->remote = remt;
217 data->flags |= OTHR_REMT;
218}
219
221{
222 // check errors
224 arax_assert(accel);
225
226 arax_data_migrate_accel(data, accel);
227}
228
230{
231 // check errors
233 arax_assert(accel);
234
235 arax_object_ref_inc(&(data->obj));
236
237 arax_data_migrate_accel(data, accel);
238}
239
241{
242 // check errors
244 arax_assert(accel);
245
246 arax_object_ref_inc(&(data->obj));
247
248 arax_data_migrate_accel(data, accel);
249}
250
252{
254 arax_data_s *vdata;
255
256 vdata = data;
257 return vdata->size;
258}
259
261{
263 arax_data_s *vdata;
264
265 vdata = (arax_data_s *) data;
266
267 ARAX_THROTTLE_DEBUG_PRINT("%s(%p) - start\n", __func__, data);
268
269 ARAX_THROTTLE_DEBUG_PRINT("%s(%p) - end\n", __func__, data);
270
271 return vdata->buffer;
272}
273
275{
276 arax_assert(data);
277
278 arax_data_s *vdata = VD_BUFF_OWNER(data);
279
280 // GCOV_EXCL_START
281 if (!vdata)
282 return 0;
283
284 if (!arax_ptr_valid(vdata))
285 return 0;
286
287 if (vdata->obj.type != ARAX_TYPE_DATA)
288 return 0;
289
290 // GCOV_EXCL_STOP
291
292 return vdata;
293}
294
296{
297 arax_assert(data);
299 // Might be at the start
300 arax_data_s *ret = arax_data_ref(data);
301
302 if (ret)
303 return ret;
304
307
308 utils_list_for_each(*datas, itr)
309 {
310 arax_data_s *vd = (arax_data_s *) (itr->owner);
311 void *start = arax_data_deref(vd);
312 void *end = start + arax_data_size(vd);
313
314 if (data > start && data < end) {
315 ret = vd;
316 break; // Found it!
317 }
318 }
319
321
322 return ret;
323}
324
326{
328 arax_data_s *vdata;
329
330 vdata = (arax_data_s *) data;
331 arax_object_ref_dec(&(vdata->obj));
332}
333
335{
337 arax_data_s *vdata;
338
339 vdata = (arax_data_s *) data;
340
341 return !!(vdata->remote);
342}
343
344#undef arax_data_stat
345
346void arax_data_stat(arax_data *data, const char *file, size_t line)
347{
349 arax_data_s *vdata;
350
351 vdata = (arax_data_s *) data;
352
353 file += strlen(file);
354 while (*file != '/')
355 file--;
356
357 int scsum = 0;
358 int cnt;
359 char *bytes = arax_data_deref(data);
360
361 for (cnt = 0; cnt < arax_data_size(data); cnt++) {
362 scsum += *bytes;
363 bytes++;
364 }
365
366 fprintf(stderr, "%s(%p)[%lu]:Flags(%s) %08x ?????? @%lu:%s\n", __func__, vdata, arax_data_size(vdata),
367 (vdata->flags & OTHR_REMT) ? "O" : " ",
368 scsum,
369 line, file
370 );
371} /* arax_data_stat */
372
374{
376 arax_data_s *data = (arax_data_s *) obj;
377
378 ARAX_THROTTLE_DEBUG_PRINT("%s(%p) - START\n", __func__, data);
379
380 if (data->remote && ((data->flags & OTHR_REMT) == 0)) {
381 if (!data->phys) {
382 fprintf(stderr, "arax_data(%p) dtor called, with dangling remote, with no accel!\n", data);
383 arax_assert(!"Orphan dangling remote");
384 } else {
385 void *args[4] =
386 { data, data->remote, (void *) (size_t) data->size, (arax_vaccel_s *) data->phys };
387 ARAX_THROTTLE_DEBUG_PRINT("Atempt to free %p %p size:%lu\n", data, data->remote, arax_data_size(data));
388 arax_proc_s *free = arax_proc_get("free");
389 arax_task_issue(data->phys->free_vaq, free, args, sizeof(args), 0, 0, 0, 0);
391 }
392 } else {
393 if (data->accel) {
394 arax_assert(((arax_object_s *) (data->accel))->type == ARAX_TYPE_VIRT_ACCEL);
396 } else {
397 fprintf(stderr, "arax_data(%p,%s,size:%lu) dtor called, data possibly unused!\n", data, obj->name, arax_data_size(
398 data));
399 }
400 }
401
402 obj->type = ARAX_TYPE_COUNT;
403}
struct arax_pipe arax_pipe_s
void arax_accel
Definition arax_types.h:9
@ CPU
Definition arax_types.h:87
@ task_completed
Definition arax_types.h:65
void arax_data
Definition arax_types.h:56
#define arax_assert(EXPR)
Definition arax_assert.h:7
#define arax_assert_obj(OBJ, TYPE)
Definition arax_assert.h:12
struct utils_list_node utils_list_node_s
#define utils_list_for_each(list, itr)
Definition list.h:96
@ OTHR_REMT
Definition arax_data.h:29
#define arax_data_stat(DATA)
Definition arax_data.h:152
#define ARAX_BUFF_ALLOC_SIZE(SIZE, ALIGN)
Definition arax_data.h:16
enum arax_object_type arax_object_type_e
@ ARAX_TYPE_DATA
Definition arax_object.h:19
@ ARAX_TYPE_COUNT
Definition arax_object.h:21
@ ARAX_TYPE_VIRT_ACCEL
Definition arax_object.h:17
#define ARAX_OBJ_DTOR_DECL(TYPE)
struct arax_task_msg arax_task_msg_s
#define ARAX_THROTTLE_DEBUG_PRINT(...)
arax_pipe_s * vpipe
Definition impl.c:17
void ARAX_THROTTLE_DEBUG_ACCEL_FUNC arax_accel_size_dec(arax_accel *accel, size_t sz ARAX_THROTTLE_DEBUG_ACCEL_PARAMS)
Definition arax_accel.c:59
void arax_data_arg_init(arax_data_s *data, arax_accel *accel)
Definition arax_data.c:220
void arax_data_output_init(arax_data_s *data, arax_accel *accel)
Definition arax_data.c:240
void * arax_data_deref(arax_data *data)
Definition arax_data.c:260
void arax_data_input_init(arax_data_s *data, arax_accel *accel)
Definition arax_data.c:229
size_t arax_data_size(arax_data *data)
Definition arax_data.c:251
void arax_data_migrate_accel(arax_data_s *data, arax_accel *accel)
Definition arax_data.c:117
arax_data_s * arax_data_init_aligned(arax_pipe_s *vpipe, size_t size, size_t align)
Definition arax_data.c:21
int arax_data_has_remote(arax_data *data)
Definition arax_data.c:334
void arax_data_get(arax_data *data, void *user)
Definition arax_data.c:52
void arax_data_memcpy(arax_accel *accel, arax_data_s *dst, arax_data_s *src, int block)
Definition arax_data.c:95
void arax_data_set(arax_data *data, arax_accel *accel, const void *user)
Definition arax_data.c:75
void arax_data_free(arax_data *data)
Definition arax_data.c:325
#define TYPE_MASK(A, B)
Definition arax_data.c:115
#define VD_BUFF_OWNER(BUFF)
Definition arax_data.c:14
arax_data * arax_data_ref_offset(arax_pipe_s *vpipe, void *data)
Definition arax_data.c:295
void arax_data_set_remote(arax_data_s *data, arax_accel *accel, void *remt)
Definition arax_data.c:206
void arax_data_set_accel(arax_data_s *data, arax_accel *accel)
Definition arax_data.c:195
arax_data_s * arax_data_init(arax_pipe_s *vpipe, size_t size)
Definition arax_data.c:16
void arax_data_allocate_remote(arax_data_s *data, arax_accel *accel)
Definition arax_data.c:162
arax_data * arax_data_ref(void *data)
Definition arax_data.c:274
arax_object_s * arax_object_register(arax_object_repo_s *repo, arax_object_type_e type, const char *name, size_t size, const int ref_count)
Definition arax_object.c:98
const char * arax_object_type_to_str(arax_object_type_e type)
Definition arax_object.c:90
void arax_object_ref_inc(arax_object_s *obj)
utils_list_s * arax_object_list_lock(arax_object_repo_s *repo, arax_object_type_e type)
void arax_object_list_unlock(arax_object_repo_s *repo, arax_object_type_e type)
int arax_object_ref_dec(arax_object_s *obj)
int arax_ptr_valid(const void *ptr)
Definition arax_ptr.c:4
void * arax_task_host_data(arax_task_msg_s *task, size_t size)
Definition arax_task.c:51
int arax_proc_put(arax_proc *func)
Definition impl.c:413
arax_proc * arax_proc_get(const char *func_name)
Definition impl.c:400
void arax_task_free(arax_task *task)
Definition impl.c:524
arax_task * arax_task_issue(arax_accel *accel, arax_proc *proc, const void *host_init, size_t host_size, size_t in_count, arax_data **dev_in, size_t out_count, arax_data **dev_out)
Definition impl.c:467
arax_task_state_e arax_task_wait(arax_task *task)
Definition impl.c:515
arax_vaccel_s * free_vaq
Definition arax_accel.h:25
void * buffer
Definition arax_data.h:46
arax_object_s obj
Definition arax_data.h:38
size_t size
Definition arax_data.h:43
void * remote
Definition arax_data.h:40
arax_accel * accel
Definition arax_data.h:42
arax_accel_s * phys
Definition arax_data.h:47
size_t align
Definition arax_data.h:44
size_t flags
Definition arax_data.h:45
arax_object_type_e type
Definition arax_object.h:45
arax_accel_s * phys
Definition arax_vaccel.h:38
void * owner
Definition list.h:14