nengel@40: #include nengel@40: nengel@40: #include "VSs.h" nengel@40: nengel@40: /*nanos_submit nengel@40: nanos_current_wd nengel@40: nanos_create_wd_compact nengel@40: nanos_handle_error nengel@40: nanos_create_wd_and_run_compact nengel@40: nengel@40: nanos_wg_wait_completion //taskwait nengel@40: nanos_wait_on //taskwait on nengel@40: nanos_set_lock //critical start nengel@40: nanos_unset_lock //critical end nengel@40: nengel@40: nanos_omp_set_interface nengel@40: nanos_smp_factory*/ nengel@40: nengel@41: int tasks_created = 0; nengel@41: nengel@40: nanos_wd_t nanos_current_wd(void) { nengel@40: return (nanos_wd_t) ((VSsSemData*) currVP->semanticData)->taskStub; nengel@40: } nengel@40: nengel@40: 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: size_t data_size, void ** data, nanos_wg_t wg, nanos_copy_data_t **copies) { nengel@41: nengel@42: *wd = NULL; nengel@42: return NANOS_OK; nengel@42: nengel@40: VSsTaskStub* ts = (VSsTaskStub*) malloc(sizeof (VSsTaskStub)); nengel@40: void* alloc_data = malloc(data_size); nengel@40: *data = alloc_data; nengel@40: ts->args = alloc_data; nengel@40: nengel@40: nanos_device_t* dev = (nanos_device_t*) &const_data[1]; nengel@40: nengel@40: VSsTaskType* taskType = (VSsTaskType*) malloc(sizeof (VSsTaskType)); nengel@40: nengel@40: taskType->fn = *((VSsTaskFnPtr*) dev[0].arg); nengel@40: taskType->sizeOfArgs = data_size; nengel@40: nengel@40: ts->taskType = taskType; nengel@40: nengel@40: *wd = (nanos_wd_t) ts; nengel@40: nengel@40: return NANOS_OK; nengel@40: } nengel@40: nengel@40: nanos_err_t nanos_submit(nanos_wd_t wd, size_t num_deps, nanos_dependence_t *deps, nanos_team_t team) { nengel@40: nengel@42: return NANOS_UNIMPLEMENTED; nengel@42: nengel@40: int32* depsTypes = malloc(sizeof (int32) * num_deps); nengel@40: size_t* depsSizes = malloc(sizeof (size_t) * num_deps); nengel@40: void** depsAddrs = malloc(sizeof (void*)*num_deps); nengel@40: nengel@40: int i; nengel@40: for (i = 0; i < num_deps; i++) { nengel@42: depsAddrs[i] = (void *) ( (char *) (*deps[i].address) + deps[i].offset ); nengel@40: depsTypes[i] = (deps[i].flags.output) ? WRITER : READER; nengel@40: depsSizes[i] = deps[i].size; nengel@40: } nengel@40: nengel@40: VSsTaskStub* ts = (VSsTaskStub*) wd; nengel@40: nengel@40: nengel@40: nengel@40: VSsTaskType* taskType = ts->taskType; nengel@40: taskType->numDeps = num_deps; nengel@40: taskType->depsTypes = depsTypes; nengel@40: taskType->depsSizes = depsSizes; nengel@40: nengel@40: nengel@40: VSsSemReq reqData; nengel@40: nengel@40: reqData.reqType = submit_task; nengel@40: nengel@40: reqData.taskType = taskType; nengel@40: reqData.args = ts->args; nengel@40: reqData.deps = depsAddrs; nengel@40: reqData.callingSlv = currVP; nengel@40: nengel@41: int32* taskID; nengel@41: taskID = VSs__create_taskID_of_size(1); nengel@41: taskID[1] = tasks_created++; nengel@41: nengel@41: reqData.taskID = taskID; nengel@40: nengel@40: free(ts); nengel@40: nengel@40: VMS_WL__send_sem_request(&reqData, currVP); nengel@40: nengel@40: return NANOS_OK; nengel@40: } nengel@40: nengel@40: 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: size_t data_size, void * data, size_t num_deps, nanos_dependence_t *deps, nengel@40: nanos_copy_data_t *copies, nanos_translate_args_t translate_args) { nengel@40: nengel@40: nengel@40: int32* depsTypes = malloc(sizeof (int32) * num_deps); nengel@40: size_t* depsSizes = malloc(sizeof (size_t) * num_deps); nengel@42: void** depsAddrs = malloc(sizeof (void*) * num_deps); nengel@40: nengel@40: int i; nengel@40: for (i = 0; i < num_deps; i++) { nengel@42: depsAddrs[i] = (void *) ( (char *) (*deps[i].address) + deps[i].offset ); nengel@40: depsTypes[i] = (deps[i].flags.output) ? WRITER : READER; nengel@40: depsSizes[i] = deps[i].size; nengel@40: } nengel@40: nengel@40: /* const_data is declared as: nengel@40: * nengel@40: * struct nanos_const_wd_definition_local_t nengel@40: { nengel@40: nanos_const_wd_definition_t base; nengel@40: nanos_device_t devices[1]; nengel@40: }; nengel@40: * and devices[0].arg is the function to call nengel@40: * so ugly pointer tricks to get it from there nengel@40: */ nengel@40: nengel@40: nanos_device_t* dev = (nanos_device_t*) &const_data[1]; nengel@40: nengel@40: VSsTaskType* taskType = (VSsTaskType*) malloc(sizeof (VSsTaskType)); nengel@40: nengel@40: taskType->fn = *((VSsTaskFnPtr*) dev[0].arg); nengel@40: taskType->numDeps = num_deps; nengel@40: taskType->depsTypes = depsTypes; nengel@40: taskType->depsSizes = depsSizes; nengel@40: taskType->sizeOfArgs = data_size; nengel@40: nengel@40: VSsSemReq reqData; nengel@40: nengel@40: reqData.reqType = submit_task; nengel@40: nengel@40: reqData.taskType = taskType; nengel@40: reqData.args = data; nengel@40: reqData.deps = depsAddrs; nengel@40: reqData.callingSlv = currVP; nengel@40: nengel@41: int32* taskID; nengel@41: taskID = VSs__create_taskID_of_size(1); nengel@41: taskID[1] = tasks_created++; nengel@41: nengel@41: reqData.taskID = taskID; nengel@40: nengel@40: VMS_WL__send_sem_request(&reqData, currVP); nengel@40: nengel@40: return NANOS_OK; nengel@40: } nengel@40: nengel@40: void nanos_handle_error(nanos_err_t err) { nengel@40: exit(err); nengel@40: } nengel@40: nengel@40: nanos_err_t nanos_wg_wait_completion(nanos_wg_t wg, bool avoid_flush) { nengel@40: VSsSemReq reqData; nengel@40: nengel@40: reqData.reqType = taskwait; nengel@40: reqData.callingSlv = currVP; nengel@40: nengel@40: VMS_WL__send_sem_request(&reqData, currVP); nengel@40: nengel@40: return NANOS_OK; nengel@40: } nengel@40: nengel@40: nanos_err_t nanos_wait_on(size_t num_deps, nanos_dependence_t *deps) { nengel@40: VSsSemReq reqData; nengel@40: nengel@40: reqData.reqType = taskwait_on; nengel@40: reqData.callingSlv = currVP; nengel@40: nengel@40: int i; nengel@40: for (i = 0; i < num_deps; i++) { nengel@40: reqData.args = deps[i].address; nengel@40: VMS_WL__send_sem_request(&reqData, currVP); nengel@40: } nengel@40: nengel@40: return NANOS_OK; nengel@40: } nengel@40: nengel@40: nanos_err_t nanos_set_lock(nanos_lock_t *lock) { nengel@40: VSsSemReq reqData; nengel@40: nengel@40: reqData.reqType = critical_start; nengel@40: reqData.callingSlv = currVP; nengel@40: nengel@40: reqData.criticalID = lock; nengel@40: nengel@40: VMS_WL__send_sem_request(&reqData, currVP); nengel@40: nengel@40: return NANOS_OK; nengel@40: } nengel@40: nengel@40: nanos_err_t nanos_unset_lock(nanos_lock_t *lock) { nengel@40: VSsSemReq reqData; nengel@40: nengel@40: reqData.reqType = critical_end; nengel@40: reqData.callingSlv = currVP; nengel@40: nengel@40: reqData.criticalID = lock; nengel@40: nengel@40: VMS_WL__send_sem_request(&reqData, currVP); nengel@40: nengel@40: return NANOS_OK; nengel@40: } nengel@40: nengel@43: nanos_err_t nanos_omp_barrier ( void ){ nengel@43: VSsSemReq reqData; nengel@43: nengel@43: reqData.reqType = barrier; nengel@43: reqData.callingSlv = currVP; nengel@43: nengel@43: VMS_WL__send_sem_request(&reqData, currVP); nengel@43: nengel@43: return NANOS_OK; nengel@43: } nengel@43: nengel@40: void * nanos_smp_factory( void *args){ nengel@40: return NULL; nengel@40: } nengel@40: nengel@40: void nanos_omp_set_interface ( void * arg){ nengel@40: return; nengel@40: }