Arax -8d09c51940345c86062e8ef2427c705ae66e5926
A Runtime Framework for Decoupling Applications from Heterogeneous Accelerators
Loading...
Searching...
No Matches
arax_accel.c
Go to the documentation of this file.
1#include "arax_pipe.h"
2#include <string.h>
3#include <stdlib.h>
4
5arax_accel_s* arax_accel_init(arax_pipe_s *pipe, const char *name,
6 arax_accel_type_e type, size_t size, size_t capacity)
7{
10 name, sizeof(arax_accel_s), 1);
11
12 if (!obj) // GCOV_EXCL_LINE
13 return obj; // GCOV_EXCL_LINE
14
15 async_condition_init(&(pipe->async), &(obj->lock));
16 obj->tasks = 0;
17 utils_list_init(&(obj->vaccels));
18 obj->type = type;
19 obj->state = accel_idle;
20 obj->revision = 0;
21 arax_throttle_init(&(pipe->async), &(obj->throttle), size, capacity);
22 obj->free_vaq = arax_vaccel_init(pipe, name, type, obj);
23 return obj;
24}
25
27{
28 async_condition_lock(&(accel->lock));
29
30 while (accel->tasks == 0)
31 async_condition_wait(&(accel->lock));
32
33 accel->tasks--;
34
36}
37
39{
40 async_condition_lock(&(accel->lock));
41 accel->tasks++;
44}
45
47{
48 return accel->tasks;
49}
50
58
66
74
76{
78 arax_accel_s *phys = accel;
79
81}
82
84{
86 return accel->obj.name;
87}
88
90{
92 /* TODO: IMPLEMENT stat memcpy */
93 return accel->state;
94}
95
97{
99 __sync_fetch_and_add(&(accel->revision), 1);
100}
101
103{
105 return accel->revision;
106}
107
109{
112
113 if ( (vaccel->phys) == accel)
114 return;
115
116 arax_assert(vaccel->phys == 0);
117
119
120 utils_spinlock_lock(&(vaccel->lock));
121
122 if ( (vaccel->phys) != accel) {
123 async_condition_lock(&(accel->lock));
124
125 utils_list_add(&(accel->vaccels), &(vaccel->vaccels));
126
127 int tasks = arax_vaccel_queue_size(vaccel);
128
129 if (tasks) {
130 accel->tasks += tasks;
131 async_condition_notify(&(accel->lock));
132 }
133
134 vaccel->phys = accel;
135
136 async_condition_unlock(&(accel->lock));
138 }
139
140 utils_spinlock_unlock(&(vaccel->lock));
141} /* arax_accel_add_vaccel */
142
144{
145 size_t count = 0;
146
147 async_condition_lock(&(accel->lock));
148 count = accel->vaccels.length;
149 *vaccel = malloc(sizeof(arax_vaccel_s *) * count);
150 utils_list_to_array(&(accel->vaccels), (void **) *vaccel);
151 async_condition_unlock(&(accel->lock));
152
153 return count;
154}
155
157{
161 arax_assert(vaccel->phys == accel);
162
163 utils_spinlock_lock(&(vaccel->lock));
164 async_condition_lock(&(accel->lock));
165
166 int tasks = arax_vaccel_queue_size(vaccel);
167
168 if (tasks) {
169 accel->tasks -= (tasks - 1);
170 async_condition_notify(&(accel->lock));
171 }
172 utils_list_del(&(accel->vaccels), &(vaccel->vaccels));
173 vaccel->phys = 0;
174
175 async_condition_unlock(&(accel->lock));
177 utils_spinlock_unlock(&(vaccel->lock));
178}
179
181{
183 arax_accel_s *accel = (arax_accel_s *) obj;
184
185 async_condition_lock(&(accel->lock));
186 if (accel->vaccels.length) {
187 fprintf(stderr, "Erasing physical accelerator %s "
188 "with %lu attached virtual accelerators!\n",
189 accel->obj.name, accel->vaccels.length);
190 arax_assert("Erasing physical accelerator with dangling virtual accels");
191 }
192 async_condition_unlock(&(accel->lock));
193 arax_accel_release((arax_accel **) (&accel->free_vaq));
194}
struct arax_pipe arax_pipe_s
enum arax_accel_state arax_accel_state_e
void arax_accel
Definition arax_types.h:9
enum arax_accel_type arax_accel_type_e
struct arax_accel_stats arax_accel_stats_s
@ accel_idle
Definition arax_types.h:44
#define arax_assert(EXPR)
Definition arax_assert.h:7
#define arax_assert_obj(OBJ, TYPE)
Definition arax_assert.h:12
#define ARAX_THROTTLE_DEBUG_ACCEL_PARAMS
Definition arax_accel.h:96
#define ARAX_THROTTLE_DEBUG_ACCEL_FUNC(FUNC)
Definition arax_accel.h:97
@ ARAX_TYPE_VIRT_ACCEL
Definition arax_object.h:17
@ ARAX_TYPE_PHYS_ACCEL
Definition arax_object.h:16
#define ARAX_OBJ_DTOR_DECL(TYPE)
void async_condition_wait(async_condition_s *cond)
void async_condition_unlock(async_condition_s *cond)
void async_condition_notify(async_condition_s *cond)
void async_condition_init(async_meta_s *meta, async_condition_s *cond)
void async_condition_lock(async_condition_s *cond)
arax_accel_s * arax_accel_init(arax_pipe_s *pipe, const char *name, arax_accel_type_e type, size_t size, size_t capacity)
Definition arax_accel.c:5
size_t arax_accel_get_total_size(arax_accel *accel)
Definition arax_accel.c:75
size_t arax_accel_pending_tasks(arax_accel_s *accel)
Definition arax_accel.c:46
size_t arax_accel_get_available_size(arax_accel *accel)
Definition arax_accel.c:67
void arax_accel_wait_for_task(arax_accel_s *accel)
Definition arax_accel.c:26
arax_accel_state_e arax_accel_get_stat(arax_accel_s *accel, arax_accel_stats_s *stat)
Definition arax_accel.c:89
const char * arax_accel_get_name(arax_accel_s *accel)
Definition arax_accel.c:83
void ARAX_THROTTLE_DEBUG_ACCEL_FUNC arax_accel_size_inc(arax_accel *accel, size_t sz ARAX_THROTTLE_DEBUG_ACCEL_PARAMS)
Definition arax_accel.c:51
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
size_t arax_accel_get_assigned_vaccels(arax_accel_s *accel, arax_vaccel_s ***vaccel)
Definition arax_accel.c:143
void arax_accel_del_vaccel(arax_accel_s *accel, arax_vaccel_s *vaccel)
Definition arax_accel.c:156
void arax_accel_add_task(arax_accel_s *accel)
Definition arax_accel.c:38
size_t arax_accel_get_revision(arax_accel_s *accel)
Definition arax_accel.c:102
void arax_accel_inc_revision(arax_accel_s *accel)
Definition arax_accel.c:96
void arax_accel_add_vaccel(arax_accel_s *accel, arax_vaccel_s *vaccel)
Definition arax_accel.c:108
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
void arax_pipe_remove_orphan_vaccel(arax_pipe_s *pipe, arax_vaccel_s *vac)
Definition arax_pipe.c:100
size_t arax_throttle_get_available_size(arax_throttle_s *thr)
void ARAX_THROTTLE_DEBUG_FUNC arax_throttle_size_dec(arax_throttle_s *thr, size_t sz ARAX_THROTTLE_DEBUG_PARAMS)
void ARAX_THROTTLE_DEBUG_FUNC arax_throttle_size_inc(arax_throttle_s *thr, size_t sz ARAX_THROTTLE_DEBUG_PARAMS)
void arax_throttle_init(async_meta_s *meta, arax_throttle_s *thr, size_t a_sz, size_t t_sz)
size_t arax_throttle_get_total_size(arax_throttle_s *thr)
arax_vaccel_s * arax_vaccel_init(arax_pipe_s *pipe, const char *name, arax_accel_type_e type, arax_accel_s *accel)
Definition arax_vaccel.c:3
unsigned int arax_vaccel_queue_size(arax_vaccel_s *vaccel)
utils_list_node_s * utils_list_del(utils_list_s *list, utils_list_node_s *node)
Definition list.c:26
utils_list_s * utils_list_init(void *mem)
Definition list.c:3
void utils_list_add(utils_list_s *list, utils_list_node_s *node)
Definition list.c:20
size_t utils_list_to_array(utils_list_s *list, void **array)
Definition list.c:58
#define utils_spinlock_lock(V)
Definition queue.c:35
#define utils_spinlock_unlock(V)
Definition queue.c:36
void arax_accel_release(arax_accel **accel)
Definition impl.c:366
size_t tasks
Definition arax_accel.h:21
arax_throttle_s throttle
Definition arax_accel.h:23
utils_list_s vaccels
Definition arax_accel.h:20
async_condition_s lock
Definition arax_accel.h:19
arax_object_s obj
Definition arax_accel.h:16
arax_accel_state_e state
Definition arax_accel.h:18
arax_accel_type_e type
Definition arax_accel.h:17
arax_vaccel_s * free_vaq
Definition arax_accel.h:25
size_t revision
Definition arax_accel.h:22
arax_pipe_s * pipe
Definition arax_object.h:29
arax_object_repo_s * repo
Definition arax_object.h:42
utils_spinlock lock
Definition arax_vaccel.h:34
arax_object_s obj
Definition arax_vaccel.h:31
arax_accel_s * phys
Definition arax_vaccel.h:38
utils_list_node_s vaccels
Definition arax_vaccel.h:35
size_t length
Definition list.h:19
async_meta_s async
Definition arax_pipe.h:34
arax_object_repo_s objs
Definition arax_pipe.h:33