static inline void spawn(int locale, chpl_fn_int_t fid, void *arg, int32_t arg_size, int32_t arg_tid, aligned_t *ret) { qthread_debug(CHAPEL_CALLS, "[%d] begin: locale=%d, fid=%d, arg_size=%d\n", chpl_localeID, locale, fid, arg_size); spawn_wrapper_args_t *wargs; size_t const wargs_size = sizeof(spawn_wrapper_args_t) + arg_size; wargs = (spawn_wrapper_args_t *)chpl_mem_allocMany(1, wargs_size, CHPL_RT_MD_COMM_FORK_SEND_INFO, 0, 0); wargs->serial_state = chpl_task_getSerial(); wargs->fid = fid; wargs->arg_size = arg_size; memcpy(&(wargs->arg), arg, arg_size); if (chpl_localeID == locale) { int const rc = qthread_fork_copyargs(spawn_wrapper, wargs, wargs_size, ret); assert(QTHREAD_SUCCESS == rc); } else { int const rc = qthread_fork_remote(spawn_wrapper, wargs, ret, locale, wargs_size); assert(SPR_OK == rc); } chpl_mem_free(wargs, 0, NULL); qthread_debug(CHAPEL_CALLS, "[%d] end: locale=%d, fid=%d, arg_size=%d\n", chpl_localeID, locale, fid, arg_size); }
void chpl_task_addToTaskList(chpl_fn_int_t fid, void *arg, c_sublocid_t subloc, chpl_task_list_p *task_list, int32_t task_list_locale, chpl_bool is_begin_stmt, int lineno, chpl_string filename) { qthread_shepherd_id_t const here_shep_id = qthread_shep(); chpl_bool serial_state = chpl_task_getSerial(); chpl_qthread_wrapper_args_t wrapper_args = {chpl_ftable[fid], arg, filename, lineno, false, {subloc, serial_state}}; assert(subloc != c_sublocid_none); PROFILE_INCR(profile_task_addToTaskList,1); if (serial_state) { syncvar_t ret = SYNCVAR_STATIC_EMPTY_INITIALIZER; qthread_fork_syncvar_copyargs_to(chapel_wrapper, &wrapper_args, sizeof(chpl_qthread_wrapper_args_t), &ret, here_shep_id); qthread_syncvar_readFF(NULL, &ret); } else if (subloc == c_sublocid_any) { qthread_fork_copyargs(chapel_wrapper, &wrapper_args, sizeof(chpl_qthread_wrapper_args_t), NULL); } else { qthread_fork_copyargs_to(chapel_wrapper, &wrapper_args, sizeof(chpl_qthread_wrapper_args_t), NULL, (qthread_shepherd_id_t) subloc); } }
void chpl_task_startMovedTask(chpl_fn_p fp, void *arg, c_sublocid_t subloc, chpl_taskID_t id, chpl_bool serial_state) { assert(subloc != c_sublocid_none); assert(id == chpl_nullTaskID); chpl_qthread_wrapper_args_t wrapper_args = {fp, arg, NULL, 0, canCountRunningTasks, PRV_DATA_IMPL_VAL(subloc, serial_state) }; PROFILE_INCR(profile_task_startMovedTask,1); if (subloc == c_sublocid_any) { qthread_fork_copyargs(chapel_wrapper, &wrapper_args, sizeof(chpl_qthread_wrapper_args_t), NULL); } else { qthread_fork_copyargs_to(chapel_wrapper, &wrapper_args, sizeof(chpl_qthread_wrapper_args_t), NULL, (qthread_shepherd_id_t) subloc); } }
static void fork_long_msg_handler(int tag, void *start, size_t len) { qthread_debug(MULTINODE_FUNCTIONS, "[%d] begin fork_long_msg_handler\n", my_rank); qthread_fork_copyargs(fork_long_helper, start, len, NULL); qthread_debug(MULTINODE_FUNCTIONS, "[%d] end fork_long_msg_handler\n", my_rank); }
int main(){ assert(qthread_initialize() == 0); qt_sinc_t sinc; qt_sinc_init(&sinc, 0, NULL, NULL, 1); int ret; args_t args = { 30, &sinc, &ret }; qthread_fork_copyargs(fib, &args, sizeof(args_t), NULL); qt_sinc_wait(&sinc, NULL); printf("%d\n", ret); }
static void fork_msg_sinc_handler(int tag, void *start, size_t len) { qthread_debug(MULTINODE_FUNCTIONS, "[%d] begin fork_msg_sinc_handler\n", my_rank); if (sizeof(struct fork_msg_t) > len) { abort(); } qthread_fork_copyargs(fork_sinc_helper, start, len, NULL); qthread_debug(MULTINODE_FUNCTIONS, "[%d] end fork_msg_sinc_handler\n", my_rank); }
aligned_t fib(void *args_){ args_t* args = (args_t*)args_; if(args->i < 2){ *args->ret = 1; qt_sinc_submit(args->s, NULL); return 0; } int x, y; qt_sinc_t sinc; qt_sinc_init(&sinc, 0, NULL, NULL, 2); args_t argsx = { args->i-1, &sinc, &x }; args_t argsy = { args->i-2, &sinc, &y }; qthread_fork_copyargs(fib, &argsx, sizeof(args_t), NULL); qthread_fork_copyargs(fib, &argsy, sizeof(args_t), NULL); qt_sinc_wait(&sinc, NULL); qt_sinc_submit(args->s, NULL); *args->ret = x + y; return 0; }