brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.1 KiB · 5775b01 Raw
148 lines · c
1// RUN: %libomp-compile-and-run2 3#include <stdio.h>4#include <stdlib.h>5#include <omp.h>6 7int a;8 9void inc_a() {10#pragma omp atomic11  a++;12}13 14void root_team_detached() {15  a = 0;16  omp_event_handle_t ev;17#pragma omp task detach(ev)18  inc_a();19  omp_fulfill_event(ev);20  if (a != 1) {21    fprintf(stderr, "error: root_team_detached(): a != 1\n");22    exit(EXIT_FAILURE);23  }24}25 26void root_team_hidden_helpers() {27  a = 0;28#pragma omp target nowait29  inc_a();30 31#pragma omp taskwait32 33  if (a != 1) {34    fprintf(stderr, "error: root_team_hidden_helpers(): a != 1\n");35    exit(EXIT_FAILURE);36  }37}38 39void parallel_detached(int nth1) {40  a = 0;41  omp_event_handle_t *evs =42      (omp_event_handle_t *)malloc(sizeof(omp_event_handle_t) * nth1);43#pragma omp parallel num_threads(nth1)44  {45    int tid = omp_get_thread_num();46    omp_event_handle_t e = evs[tid];47#pragma omp task detach(e)48    inc_a();49    omp_fulfill_event(e);50  }51  free(evs);52  if (a != nth1) {53    fprintf(stderr, "error: parallel_detached(): a (%d) != %d\n", a, nth1);54    exit(EXIT_FAILURE);55  }56}57 58void parallel_hidden_helpers(int nth1) {59  a = 0;60#pragma omp parallel num_threads(nth1)61  {62#pragma omp target nowait63    inc_a();64  }65  if (a != nth1) {66    fprintf(stderr, "error: parallel_hidden_helpers(): a (%d) != %d\n", a,67            nth1);68    exit(EXIT_FAILURE);69  }70}71 72void nested_parallel_detached(int nth1, int nth2) {73  a = 0;74  omp_event_handle_t **evs =75      (omp_event_handle_t **)malloc(sizeof(omp_event_handle_t *) * nth1);76#pragma omp parallel num_threads(nth1)77  {78    int tid = omp_get_thread_num();79    evs[tid] = (omp_event_handle_t *)malloc(sizeof(omp_event_handle_t) * nth2);80#pragma omp parallel num_threads(nth2) shared(tid)81    {82      int tid2 = omp_get_thread_num();83      omp_event_handle_t e = evs[tid][tid2];84#pragma omp task detach(e)85      inc_a();86      omp_fulfill_event(e);87    }88    free(evs[tid]);89  }90  free(evs);91  if (a != nth1 * nth2) {92    fprintf(stderr, "error: nested_parallel_detached(): a (%d) != %d * %d\n", a,93            nth1, nth2);94    exit(EXIT_FAILURE);95  }96}97 98void nested_parallel_hidden_helpers(int nth1, int nth2) {99  a = 0;100#pragma omp parallel num_threads(nth1)101  {102#pragma omp parallel num_threads(nth2)103    {104#pragma omp target nowait105      inc_a();106    }107  }108  if (a != nth1 * nth2) {109    fprintf(stderr,110            "error: nested_parallel_hidden_helpers(): a (%d) != %d * %d\n", a,111            nth1, nth2);112    exit(EXIT_FAILURE);113  }114}115 116int main() {117  int i, nth1, nth2;118 119  omp_set_max_active_levels(2);120  omp_set_dynamic(0);121 122  for (i = 0; i < 10; ++i)123    root_team_detached();124 125  for (i = 0; i < 10; ++i)126    root_team_hidden_helpers();127 128  for (i = 0; i < 10; ++i)129    for (nth1 = 1; nth1 <= 4; ++nth1)130      parallel_detached(nth1);131 132  for (i = 0; i < 10; ++i)133    for (nth1 = 1; nth1 <= 4; ++nth1)134      parallel_hidden_helpers(nth1);135 136  for (i = 0; i < 10; ++i)137    for (nth1 = 1; nth1 <= 4; ++nth1)138      for (nth2 = 1; nth2 <= 4; ++nth2)139        nested_parallel_detached(nth1, nth2);140 141  for (i = 0; i < 10; ++i)142    for (nth1 = 1; nth1 <= 4; ++nth1)143      for (nth2 = 1; nth2 <= 4; ++nth2)144        nested_parallel_hidden_helpers(nth1, nth2);145 146  return 0;147}148