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