annotate nanos-vss.c @ 46:6be6b0394537

add nanos_in_final
author Nina Engelhardt <nengel@mailbox.tu-berlin.de>
date Fri, 05 Jul 2013 14:41:45 +0200
parents 19114b7a2357
children a7c77d69d127
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 }