| 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@47
|
26 size_t data_size, void ** data, nanos_wg_t wg, nanos_copy_data_t **copies, nanos_region_dimension_internal_t **dimensions) {
|
|
nengel@47
|
27
|
|
nengel@42
|
28 *wd = NULL;
|
|
nengel@42
|
29 return NANOS_OK;
|
|
nengel@47
|
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@47
|
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@47
|
48 nanos_err_t nanos_submit(nanos_wd_t wd, size_t num_data_accesses, nanos_data_access_t *data_accesses, nanos_team_t team) {
|
|
nengel@40
|
49
|
|
nengel@42
|
50 return NANOS_UNIMPLEMENTED;
|
|
nengel@47
|
51
|
|
nengel@47
|
52 int32* depsTypes = malloc(sizeof (int32) * num_data_accesses);
|
|
nengel@47
|
53 size_t* depsSizes = malloc(sizeof (size_t) * num_data_accesses);
|
|
nengel@47
|
54 void** depsAddrs = malloc(sizeof (void*)*num_data_accesses);
|
|
nengel@40
|
55
|
|
nengel@40
|
56 int i;
|
|
nengel@47
|
57 for (i = 0; i < num_data_accesses; i++) {
|
|
nengel@47
|
58 depsAddrs[i] = (void*)((uintptr_t)data_accesses[i].address + data_accesses[i].offset );
|
|
nengel@47
|
59 depsTypes[i] = (data_accesses[i].flags.output) ? WRITER : READER;
|
|
nengel@47
|
60 depsSizes[i] = data_accesses[i].dimensions[0].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@47
|
68 taskType->numDeps = num_data_accesses;
|
|
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@47
|
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@47
|
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@47
|
96 size_t data_size, void * data, size_t num_data_accesses, nanos_data_access_t *data_accesses,
|
|
nengel@47
|
97 nanos_copy_data_t *copies, nanos_region_dimension_internal_t *dimensions, nanos_translate_args_t translate_args ) {
|
|
nengel@40
|
98
|
|
nengel@40
|
99
|
|
nengel@47
|
100 int32* depsTypes = malloc(sizeof (int32) * num_data_accesses);
|
|
nengel@47
|
101 size_t* depsSizes = malloc(sizeof (size_t) * num_data_accesses);
|
|
nengel@47
|
102 void** depsAddrs = malloc(sizeof (void*) * num_data_accesses);
|
|
nengel@40
|
103
|
|
nengel@40
|
104 int i;
|
|
nengel@47
|
105 for (i = 0; i < num_data_accesses; i++) {
|
|
nengel@47
|
106 depsAddrs[i] = (void*)((uintptr_t)data_accesses[i].address + data_accesses[i].offset );
|
|
nengel@47
|
107 depsTypes[i] = (data_accesses[i].flags.output) ? WRITER : READER;
|
|
nengel@47
|
108 depsSizes[i] = data_accesses[i].dimensions[0].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@47
|
124 taskType->fn = *((VSsTaskFnPtr*) ((nanos_device_t*) & const_data[1])->arg);
|
|
nengel@47
|
125 taskType->numDeps = num_data_accesses;
|
|
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@47
|
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@47
|
165 nanos_err_t nanos_wait_on( size_t num_data_accesses, nanos_data_access_t *data_accesses ) {
|
|
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@47
|
172 for (i = 0; i < num_data_accesses; i++) {
|
|
nengel@47
|
173 reqData.args = data_accesses[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@47
|
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@47
|
202
|
|
nengel@40
|
203 return NANOS_OK;
|
|
nengel@40
|
204 }
|
|
nengel@40
|
205
|
|
nengel@47
|
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@47
|
213
|
|
nengel@43
|
214 return NANOS_OK;
|
|
nengel@43
|
215 }
|
|
nengel@43
|
216
|
|
nengel@47
|
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@47
|
222 void * nanos_smp_factory(void *args) {
|
|
nengel@40
|
223 return NULL;
|
|
nengel@40
|
224 }
|
|
nengel@40
|
225
|
|
nengel@47
|
226 void nanos_omp_set_interface(void * arg) {
|
|
nengel@40
|
227 return;
|
|
nengel@45
|
228 }
|