annotate nanos-vss.c @ 48:b8bb94b990c4

fix: 0 dependency tasks were never started
author Nina Engelhardt <nengel@mailbox.tu-berlin.de>
date Tue, 09 Jul 2013 11:50:09 +0200
parents 6be6b0394537
children
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 }