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