annotate nanos-vss.c @ 44:7e7f37aa2f61

fix barrier
author Nina Engelhardt <nengel@mailbox.tu-berlin.de>
date Tue, 11 Jun 2013 15:40:51 +0200
parents bb6fbcbce14d
children 19114b7a2357
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 }