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@47: size_t data_size, void ** data, nanos_wg_t wg, nanos_copy_data_t **copies, nanos_region_dimension_internal_t **dimensions) { nengel@47: nengel@42: *wd = NULL; nengel@42: return NANOS_OK; nengel@47: 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: VSsTaskType* taskType = (VSsTaskType*) malloc(sizeof (VSsTaskType)); nengel@40: nengel@47: taskType->fn = *((VSsTaskFnPtr*) ((nanos_device_t*) & const_data[1])->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@47: 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: nengel@42: return NANOS_UNIMPLEMENTED; nengel@47: nengel@47: int32* depsTypes = malloc(sizeof (int32) * num_data_accesses); nengel@47: size_t* depsSizes = malloc(sizeof (size_t) * num_data_accesses); nengel@47: void** depsAddrs = malloc(sizeof (void*)*num_data_accesses); nengel@40: nengel@40: int i; nengel@47: for (i = 0; i < num_data_accesses; i++) { nengel@47: depsAddrs[i] = (void*)((uintptr_t)data_accesses[i].address + data_accesses[i].offset ); nengel@47: depsTypes[i] = (data_accesses[i].flags.output) ? WRITER : READER; nengel@47: depsSizes[i] = data_accesses[i].dimensions[0].size; nengel@40: } nengel@40: nengel@40: VSsTaskStub* ts = (VSsTaskStub*) wd; nengel@40: nengel@40: nengel@40: nengel@40: VSsTaskType* taskType = ts->taskType; nengel@47: taskType->numDeps = num_data_accesses; 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@47: 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@47: 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: size_t data_size, void * data, size_t num_data_accesses, nanos_data_access_t *data_accesses, nengel@47: nanos_copy_data_t *copies, nanos_region_dimension_internal_t *dimensions, nanos_translate_args_t translate_args ) { nengel@40: nengel@40: nengel@47: int32* depsTypes = malloc(sizeof (int32) * num_data_accesses); nengel@47: size_t* depsSizes = malloc(sizeof (size_t) * num_data_accesses); nengel@47: void** depsAddrs = malloc(sizeof (void*) * num_data_accesses); nengel@40: nengel@40: int i; nengel@47: for (i = 0; i < num_data_accesses; i++) { nengel@47: depsAddrs[i] = (void*)((uintptr_t)data_accesses[i].address + data_accesses[i].offset ); nengel@47: depsTypes[i] = (data_accesses[i].flags.output) ? WRITER : READER; nengel@47: depsSizes[i] = data_accesses[i].dimensions[0].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: VSsTaskType* taskType = (VSsTaskType*) malloc(sizeof (VSsTaskType)); nengel@40: nengel@47: taskType->fn = *((VSsTaskFnPtr*) ((nanos_device_t*) & const_data[1])->arg); nengel@47: taskType->numDeps = num_data_accesses; 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@47: 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@47: nanos_err_t nanos_wait_on( size_t num_data_accesses, nanos_data_access_t *data_accesses ) { nengel@40: VSsSemReq reqData; nengel@40: nengel@40: reqData.reqType = taskwait_on; nengel@40: reqData.callingSlv = currVP; nengel@40: nengel@40: int i; nengel@47: for (i = 0; i < num_data_accesses; i++) { nengel@47: reqData.args = data_accesses[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@47: 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@47: nengel@40: return NANOS_OK; nengel@40: } nengel@40: nengel@47: 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@47: nengel@43: return NANOS_OK; nengel@43: } nengel@43: nengel@47: nanos_err_t nanos_in_final(bool *result) { nengel@46: *result = false; nengel@46: return NANOS_OK; nengel@46: } nengel@46: nengel@47: void * nanos_smp_factory(void *args) { nengel@40: return NULL; nengel@40: } nengel@40: nengel@47: void nanos_omp_set_interface(void * arg) { nengel@40: return; nengel@45: }