brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.4 KiB · 06b0586 Raw
96 lines · c
1// RUN: %libomp-compile-and-run2// UNSUPPORTED: gcc3// Linking fails for icc 18/194// UNSUPPORTED: icc-18, icc-195 6#include <stdio.h>7#include <stdlib.h>8#include <omp.h>9 10#define NT 811 12#ifdef __cplusplus13extern "C" {14#endif15typedef int kmp_int32;16typedef struct ident {17  kmp_int32 reserved_1;18  kmp_int32 flags;19  kmp_int32 reserved_2;20  kmp_int32 reserved_3;21  char const *psource;22} ident_t;23extern int __kmpc_global_thread_num(ident_t *);24extern void __kmpc_push_num_teams_51(ident_t *, kmp_int32, kmp_int32, kmp_int32,25                                     kmp_int32);26#ifdef __cplusplus27}28#endif29 30void check_num_teams(int num_teams_lb, int num_teams_ub, int thread_limit) {31  int nteams, nthreads;32  int a = 0;33 34  int gtid = __kmpc_global_thread_num(NULL);35  __kmpc_push_num_teams_51(NULL, gtid, num_teams_lb, num_teams_ub,36                           thread_limit);37 38#pragma omp teams default(shared)39  {40    int priv_nteams;41    int team_num = omp_get_team_num();42    if (team_num == 0)43      nteams = omp_get_num_teams();44    priv_nteams = omp_get_num_teams();45#pragma omp parallel46    {47      int priv_nthreads;48      int thread_num = omp_get_thread_num();49      int teams_ub, teams_lb, thr_limit;50      if (team_num == 0 && thread_num == 0)51        nthreads = omp_get_num_threads();52      priv_nthreads = omp_get_num_threads();53 54      teams_ub = (num_teams_ub ? num_teams_ub : priv_nteams);55      teams_lb = (num_teams_lb ? num_teams_lb : teams_ub);56      thr_limit = (thread_limit ? thread_limit : priv_nthreads);57 58      if (priv_nteams < teams_lb || priv_nteams > teams_ub) {59        fprintf(stderr, "error: invalid number of teams=%d\n", priv_nteams);60        exit(1);61      }62      if (priv_nthreads > thr_limit) {63        fprintf(stderr, "error: invalid number of threads=%d\n", priv_nthreads);64        exit(1);65      }66#pragma omp atomic67      a++;68    }69  }70  if (a != nteams * nthreads) {71    fprintf(stderr, "error: a (%d) != nteams * nthreads (%d)\n", a,72            nteams * nthreads);73    exit(1);74  } else {75    printf("#teams %d, #threads %d: Hello!\n", nteams, nthreads);76  }77}78 79int main(int argc, char *argv[]) {80  omp_set_num_threads(NT);81 82  check_num_teams(1, 8, 2);83  check_num_teams(2, 2, 2);84  check_num_teams(2, 2, 0);85  check_num_teams(8, 16, 2);86  check_num_teams(9, 16, 0);87  check_num_teams(9, 16, 2);88  check_num_teams(2, 3, 0);89  check_num_teams(0, 0, 2);90  check_num_teams(0, 4, 0);91  check_num_teams(0, 2, 2);92 93  printf("Test Passed\n");94  return 0;95}96