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