| rev |
line source |
|
nengel@40
|
1 #include <nanox/nanos.h>
|
|
nengel@40
|
2
|
|
nengel@40
|
3 #include "VSs.h"
|
|
nengel@40
|
4
|
|
nengel@40
|
5 /*nanos_submit
|
|
nengel@40
|
6 nanos_current_wd
|
|
nengel@40
|
7 nanos_create_wd_compact
|
|
nengel@40
|
8 nanos_handle_error
|
|
nengel@40
|
9 nanos_create_wd_and_run_compact
|
|
nengel@40
|
10
|
|
nengel@40
|
11 nanos_wg_wait_completion //taskwait
|
|
nengel@40
|
12 nanos_wait_on //taskwait on
|
|
nengel@40
|
13 nanos_set_lock //critical start
|
|
nengel@40
|
14 nanos_unset_lock //critical end
|
|
nengel@40
|
15
|
|
nengel@40
|
16 nanos_omp_set_interface
|
|
nengel@40
|
17 nanos_smp_factory*/
|
|
nengel@40
|
18
|
|
nengel@40
|
19 nanos_wd_t nanos_current_wd(void) {
|
|
nengel@40
|
20 return (nanos_wd_t) ((VSsSemData*) currVP->semanticData)->taskStub;
|
|
nengel@40
|
21 }
|
|
nengel@40
|
22
|
|
nengel@40
|
23 nanos_err_t nanos_create_wd_compact(nanos_wd_t *wd, nanos_const_wd_definition_t *const_data, nanos_wd_dyn_props_t *dyn_props,
|
|
nengel@40
|
24 size_t data_size, void ** data, nanos_wg_t wg, nanos_copy_data_t **copies) {
|
|
nengel@40
|
25 VSsTaskStub* ts = (VSsTaskStub*) malloc(sizeof (VSsTaskStub));
|
|
nengel@40
|
26 void* alloc_data = malloc(data_size);
|
|
nengel@40
|
27 *data = alloc_data;
|
|
nengel@40
|
28 ts->args = alloc_data;
|
|
nengel@40
|
29
|
|
nengel@40
|
30 nanos_device_t* dev = (nanos_device_t*) &const_data[1];
|
|
nengel@40
|
31
|
|
nengel@40
|
32 VSsTaskType* taskType = (VSsTaskType*) malloc(sizeof (VSsTaskType));
|
|
nengel@40
|
33
|
|
nengel@40
|
34 taskType->fn = *((VSsTaskFnPtr*) dev[0].arg);
|
|
nengel@40
|
35 taskType->sizeOfArgs = data_size;
|
|
nengel@40
|
36
|
|
nengel@40
|
37 ts->taskType = taskType;
|
|
nengel@40
|
38
|
|
nengel@40
|
39 *wd = (nanos_wd_t) ts;
|
|
nengel@40
|
40
|
|
nengel@40
|
41 return NANOS_OK;
|
|
nengel@40
|
42 }
|
|
nengel@40
|
43
|
|
nengel@40
|
44 nanos_err_t nanos_submit(nanos_wd_t wd, size_t num_deps, nanos_dependence_t *deps, nanos_team_t team) {
|
|
nengel@40
|
45
|
|
nengel@40
|
46 int32* depsTypes = malloc(sizeof (int32) * num_deps);
|
|
nengel@40
|
47 size_t* depsSizes = malloc(sizeof (size_t) * num_deps);
|
|
nengel@40
|
48 void** depsAddrs = malloc(sizeof (void*)*num_deps);
|
|
nengel@40
|
49
|
|
nengel@40
|
50 int i;
|
|
nengel@40
|
51 for (i = 0; i < num_deps; i++) {
|
|
nengel@40
|
52 depsAddrs[i] = deps[i].address;
|
|
nengel@40
|
53 depsTypes[i] = (deps[i].flags.output) ? WRITER : READER;
|
|
nengel@40
|
54 depsSizes[i] = deps[i].size;
|
|
nengel@40
|
55 }
|
|
nengel@40
|
56
|
|
nengel@40
|
57 VSsTaskStub* ts = (VSsTaskStub*) wd;
|
|
nengel@40
|
58
|
|
nengel@40
|
59
|
|
nengel@40
|
60
|
|
nengel@40
|
61 VSsTaskType* taskType = ts->taskType;
|
|
nengel@40
|
62 taskType->numDeps = num_deps;
|
|
nengel@40
|
63 taskType->depsTypes = depsTypes;
|
|
nengel@40
|
64 taskType->depsSizes = depsSizes;
|
|
nengel@40
|
65
|
|
nengel@40
|
66
|
|
nengel@40
|
67 VSsSemReq reqData;
|
|
nengel@40
|
68
|
|
nengel@40
|
69 reqData.reqType = submit_task;
|
|
nengel@40
|
70
|
|
nengel@40
|
71 reqData.taskType = taskType;
|
|
nengel@40
|
72 reqData.args = ts->args;
|
|
nengel@40
|
73 reqData.deps = depsAddrs;
|
|
nengel@40
|
74 reqData.callingSlv = currVP;
|
|
nengel@40
|
75
|
|
nengel@40
|
76 reqData.taskID = NULL;
|
|
nengel@40
|
77
|
|
nengel@40
|
78 free(ts);
|
|
nengel@40
|
79
|
|
nengel@40
|
80 VMS_WL__send_sem_request(&reqData, currVP);
|
|
nengel@40
|
81
|
|
nengel@40
|
82 return NANOS_OK;
|
|
nengel@40
|
83 }
|
|
nengel@40
|
84
|
|
nengel@40
|
85 nanos_err_t nanos_create_wd_and_run_compact(nanos_const_wd_definition_t *const_data, nanos_wd_dyn_props_t *dyn_props,
|
|
nengel@40
|
86 size_t data_size, void * data, size_t num_deps, nanos_dependence_t *deps,
|
|
nengel@40
|
87 nanos_copy_data_t *copies, nanos_translate_args_t translate_args) {
|
|
nengel@40
|
88
|
|
nengel@40
|
89
|
|
nengel@40
|
90 int32* depsTypes = malloc(sizeof (int32) * num_deps);
|
|
nengel@40
|
91 size_t* depsSizes = malloc(sizeof (size_t) * num_deps);
|
|
nengel@40
|
92 void** depsAddrs = malloc(sizeof (void*)*num_deps);
|
|
nengel@40
|
93
|
|
nengel@40
|
94 int i;
|
|
nengel@40
|
95 for (i = 0; i < num_deps; i++) {
|
|
nengel@40
|
96 depsAddrs[i] = deps[i].address;
|
|
nengel@40
|
97 depsTypes[i] = (deps[i].flags.output) ? WRITER : READER;
|
|
nengel@40
|
98 depsSizes[i] = deps[i].size;
|
|
nengel@40
|
99 }
|
|
nengel@40
|
100
|
|
nengel@40
|
101 /* const_data is declared as:
|
|
nengel@40
|
102 *
|
|
nengel@40
|
103 * struct nanos_const_wd_definition_local_t
|
|
nengel@40
|
104 {
|
|
nengel@40
|
105 nanos_const_wd_definition_t base;
|
|
nengel@40
|
106 nanos_device_t devices[1];
|
|
nengel@40
|
107 };
|
|
nengel@40
|
108 * and devices[0].arg is the function to call
|
|
nengel@40
|
109 * so ugly pointer tricks to get it from there
|
|
nengel@40
|
110 */
|
|
nengel@40
|
111
|
|
nengel@40
|
112 nanos_device_t* dev = (nanos_device_t*) &const_data[1];
|
|
nengel@40
|
113
|
|
nengel@40
|
114 VSsTaskType* taskType = (VSsTaskType*) malloc(sizeof (VSsTaskType));
|
|
nengel@40
|
115
|
|
nengel@40
|
116 taskType->fn = *((VSsTaskFnPtr*) dev[0].arg);
|
|
nengel@40
|
117 taskType->numDeps = num_deps;
|
|
nengel@40
|
118 taskType->depsTypes = depsTypes;
|
|
nengel@40
|
119 taskType->depsSizes = depsSizes;
|
|
nengel@40
|
120 taskType->sizeOfArgs = data_size;
|
|
nengel@40
|
121
|
|
nengel@40
|
122 VSsSemReq reqData;
|
|
nengel@40
|
123
|
|
nengel@40
|
124 reqData.reqType = submit_task;
|
|
nengel@40
|
125
|
|
nengel@40
|
126 reqData.taskType = taskType;
|
|
nengel@40
|
127 reqData.args = data;
|
|
nengel@40
|
128 reqData.deps = depsAddrs;
|
|
nengel@40
|
129 reqData.callingSlv = currVP;
|
|
nengel@40
|
130
|
|
nengel@40
|
131 reqData.taskID = NULL;
|
|
nengel@40
|
132
|
|
nengel@40
|
133 VMS_WL__send_sem_request(&reqData, currVP);
|
|
nengel@40
|
134
|
|
nengel@40
|
135 return NANOS_OK;
|
|
nengel@40
|
136 }
|
|
nengel@40
|
137
|
|
nengel@40
|
138 void nanos_handle_error(nanos_err_t err) {
|
|
nengel@40
|
139 exit(err);
|
|
nengel@40
|
140 }
|
|
nengel@40
|
141
|
|
nengel@40
|
142 nanos_err_t nanos_wg_wait_completion(nanos_wg_t wg, bool avoid_flush) {
|
|
nengel@40
|
143 VSsSemReq reqData;
|
|
nengel@40
|
144
|
|
nengel@40
|
145 reqData.reqType = taskwait;
|
|
nengel@40
|
146 reqData.callingSlv = currVP;
|
|
nengel@40
|
147
|
|
nengel@40
|
148 VMS_WL__send_sem_request(&reqData, currVP);
|
|
nengel@40
|
149
|
|
nengel@40
|
150 return NANOS_OK;
|
|
nengel@40
|
151 }
|
|
nengel@40
|
152
|
|
nengel@40
|
153 nanos_err_t nanos_wait_on(size_t num_deps, nanos_dependence_t *deps) {
|
|
nengel@40
|
154 VSsSemReq reqData;
|
|
nengel@40
|
155
|
|
nengel@40
|
156 reqData.reqType = taskwait_on;
|
|
nengel@40
|
157 reqData.callingSlv = currVP;
|
|
nengel@40
|
158
|
|
nengel@40
|
159 int i;
|
|
nengel@40
|
160 for (i = 0; i < num_deps; i++) {
|
|
nengel@40
|
161 reqData.args = deps[i].address;
|
|
nengel@40
|
162 VMS_WL__send_sem_request(&reqData, currVP);
|
|
nengel@40
|
163 }
|
|
nengel@40
|
164
|
|
nengel@40
|
165 return NANOS_OK;
|
|
nengel@40
|
166 }
|
|
nengel@40
|
167
|
|
nengel@40
|
168 nanos_err_t nanos_set_lock(nanos_lock_t *lock) {
|
|
nengel@40
|
169 VSsSemReq reqData;
|
|
nengel@40
|
170
|
|
nengel@40
|
171 reqData.reqType = critical_start;
|
|
nengel@40
|
172 reqData.callingSlv = currVP;
|
|
nengel@40
|
173
|
|
nengel@40
|
174 reqData.criticalID = lock;
|
|
nengel@40
|
175
|
|
nengel@40
|
176 VMS_WL__send_sem_request(&reqData, currVP);
|
|
nengel@40
|
177
|
|
nengel@40
|
178 return NANOS_OK;
|
|
nengel@40
|
179 }
|
|
nengel@40
|
180
|
|
nengel@40
|
181 nanos_err_t nanos_unset_lock(nanos_lock_t *lock) {
|
|
nengel@40
|
182 VSsSemReq reqData;
|
|
nengel@40
|
183
|
|
nengel@40
|
184 reqData.reqType = critical_end;
|
|
nengel@40
|
185 reqData.callingSlv = currVP;
|
|
nengel@40
|
186
|
|
nengel@40
|
187 reqData.criticalID = lock;
|
|
nengel@40
|
188
|
|
nengel@40
|
189 VMS_WL__send_sem_request(&reqData, currVP);
|
|
nengel@40
|
190
|
|
nengel@40
|
191 return NANOS_OK;
|
|
nengel@40
|
192 }
|
|
nengel@40
|
193
|
|
nengel@40
|
194 void * nanos_smp_factory( void *args){
|
|
nengel@40
|
195 return NULL;
|
|
nengel@40
|
196 }
|
|
nengel@40
|
197
|
|
nengel@40
|
198 void nanos_omp_set_interface ( void * arg){
|
|
nengel@40
|
199 return;
|
|
nengel@40
|
200 } |