36int test(
unsigned upper_bound) {
38 unsigned total_iterations = upper_bound * (upper_bound - 1) / 2;
40 unsigned lower_per_chunk = total_iterations / num_threads;
41 unsigned upper_per_chunk =
42 lower_per_chunk + ((total_iterations % num_threads) ? 1 : 0);
52 "INFO: Using %6d threads for %6d outer iterations with %6d [%6d:%6d] "
54 "loop type lower triangle <,< - ",
55 num_threads, upper_bound, total_iterations, lower_per_chunk,
59#pragma omp parallel shared(iterations_per_thread, execution_count)
62#pragma omp for schedule(static) collapse(2)
63 for (
i = 0;
i < upper_bound;
i++) {
64 for (
j = 0;
j <
i;
j++) {
72 for (
i = 0;
i < upper_bound;
i++) {
73 for (
j = 0;
j <
i;
j++) {
78 fprintf(stderr,
"ERROR: valid iteration [%i,%i] executed %i times.\n",
83 for (
j =
i;
j < upper_bound;
j++) {
88 fprintf(stderr,
"ERROR: invalid iteration [%i,%i] executed %i times.\n",
95#ifndef NO_EFFICIENCY_CHECK
97 for (
i = 0;
i < num_threads;
i++) {
101 "ERROR: Inefficient Collapse thread %d of %d assigned %i "
102 "iterations; must be between %d and %d\n",
103 i, num_threads,
value, lower_per_chunk, upper_per_chunk);
109 fprintf(stderr,
"PASSED\r\n");