int MTest_thread_barrier_free(void) { MTest_thread_lock_free(&barrierLock); return pthread_barrier_destroy(&barrier); }
int MTest_thread_barrier_free(void) { return MTest_thread_lock_free(&barrierLock); }
void loops(void) { int i, nt; double latency, mrate, avg_latency, agg_mrate; int err; err = MTest_thread_lock_create(&num_threads_lock); if (err) ABORT_MSG("unable to create lock, aborting\n"); for (nt = 1; nt <= MAX_THREADS; nt++) { err = MTest_thread_lock(&num_threads_lock); if (err) ABORT_MSG("unable to acquire lock, aborting\n"); num_threads = 1; MPI_Barrier(MPI_COMM_WORLD); MTest_thread_barrier_init(); for (i = 1; i < nt; i++) { err = MTest_Start_thread(run_test, (void *)(long)i); if (err) { /* attempt to continue with fewer threads, we may be on a * thread-constrained platform like BG/P in DUAL mode */ break; } ++num_threads; } err = MTest_thread_unlock(&num_threads_lock); if (err) ABORT_MSG("unable to release lock, aborting\n"); if (nt > 1 && num_threads <= 1) { ABORT_MSG("unable to create any additional threads, aborting\n"); } run_test((void *) 0); /* we are thread 0 */ err = MTest_Join_threads(); if (err) { printf("error joining threads, err=%d", err); MPI_Abort(MPI_COMM_WORLD, 1); } MTest_thread_barrier_free(); latency = 0; for (i = 0; i < num_threads; i++) latency += tp[i].latency; latency /= num_threads; /* Average latency */ mrate = num_threads / latency; /* Message rate */ /* Global latency and message rate */ MPI_Reduce(&latency, &avg_latency, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); avg_latency /= size; MPI_Reduce(&mrate, &agg_mrate, 1, MPI_DOUBLE, MPI_SUM, 0, MPI_COMM_WORLD); if (!rank && verbose) { printf("Threads: %d; Latency: %.3f; Mrate: %.3f\n", num_threads, latency, mrate); } } err = MTest_thread_lock_free(&num_threads_lock); if (err) ABORT_MSG("unable to free lock, aborting\n"); }