annotate nanos-vss.c @ 41:37bb39da5ff1

static3d working, still trouble with child tasks
author Nina Engelhardt <nengel@mailbox.tu-berlin.de>
date Wed, 05 Jun 2013 14:40:40 +0200
parents df464a215387
children bb6fbcbce14d
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 }