コード例 #1
0
ファイル: comm-qthreads.c プロジェクト: Agobin/chapel
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);
}
コード例 #2
0
ファイル: tasks-qthreads.c プロジェクト: Improbus/CPEG614
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);
    }
}
コード例 #3
0
ファイル: tasks-qthreads.c プロジェクト: tzakian/chapel
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);
    }
}
コード例 #4
0
ファイル: net.c プロジェクト: Agobin/chapel
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);
}
コード例 #5
0
ファイル: sinc_workers.c プロジェクト: RaftLib/qthreads
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);
}
コード例 #6
0
ファイル: net.c プロジェクト: deniskin82/chapel
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);
}
コード例 #7
0
ファイル: sinc_workers.c プロジェクト: RaftLib/qthreads
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;
}