void * f(void * arg_) { arg_t * arg = (arg_t *)arg_; long a = arg->a, b = arg->b; long ninc_per_thread = arg->ninc_per_thread; #if DBG printf("%ld : f(%ld,%ld)\n", myth_get_worker_num(), a, b); #endif if (b - a == 1) { int i; for (i = 0; i < ninc_per_thread; i++) { myth_mutex_lock(arg->m); arg->p[0]++; myth_mutex_unlock(arg->m); } arg->r = a; } else { long c = (a + b) / 2; arg_t cargs[2] = { { ninc_per_thread, a, c, 0, arg->p, arg->m }, { ninc_per_thread, c, b, 0, arg->p, arg->m } }; myth_thread_t tid = myth_create(f, cargs); f(cargs + 1); myth_join(tid, 0); arg->r = cargs[0].r + cargs[1].r; } return 0; }
int accalt_get_thread_num() { #ifdef ARGOBOTS int rank; ABT_xstream_self_rank(&rank); return rank; #endif #ifdef MASSIVETHREADS return myth_get_worker_num(); #endif #ifdef QTHREADS return qthread_shep(); #endif }