brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.0 KiB · 800edc4 Raw
83 lines · c
1// RUN: %libomp-compile && env OMP_THREAD_LIMIT=4 %libomp-run 42// RUN: %libomp-compile && env OMP_THREAD_LIMIT=7 %libomp-run 73//4// OMP_THREAD_LIMIT=N should imply that no more than N threads are active in5// a contention group6#include <stdio.h>7#include <string.h>8#include <limits.h>9#include "omp_testsuite.h"10 11int failed = 0;12 13void usage() {14    fprintf(stderr, "usage: omp_thread_limit <n>\n");15}16 17void verify(const char* file_name, int line_number, int team_size) {18  int num_threads = omp_get_num_threads();19  if (team_size != num_threads) {20#pragma omp critical(A)21    {22      char label[256];23      snprintf(label, sizeof(label), "%s:%d", file_name, line_number);24      failed = 1;25      printf("failed: %s: team_size(%d) != omp_get_num_threads(%d)\n",26             label, team_size, num_threads);27    }28  }29}30 31int main(int argc, char** argv)32{33  int cl_thread_limit;34 35  if (argc != 2) {36    usage();37    return 1;38  }39  cl_thread_limit = atoi(argv[1]);40 41  omp_set_dynamic(0);42  if (omp_get_thread_limit() != cl_thread_limit) {43    fprintf(stderr, "omp_get_thread_limit failed with %d, should be%d\n",44            omp_get_thread_limit(), cl_thread_limit);45    return 1;46  }47  else if (omp_get_max_threads() > cl_thread_limit) {48#if _OPENMP49    int team_size = cl_thread_limit;50#else51    int team_size = 1;52#endif53    omp_set_num_threads(19);54    verify(__FILE__, __LINE__, 1);55#pragma omp parallel56    {57      verify(__FILE__, __LINE__, team_size);58      verify(__FILE__, __LINE__, team_size);59    }60    verify(__FILE__, __LINE__, 1);61 62    omp_set_nested(1);63#pragma omp parallel num_threads(3)64    {65      verify(__FILE__, __LINE__, 3);66#pragma omp master67#pragma omp parallel num_threads(21)68      {69        verify(__FILE__, __LINE__, team_size-2);70        verify(__FILE__, __LINE__, team_size-2);71      }72    }73    verify(__FILE__, __LINE__, 1);74 75    return failed;76  } else {77    fprintf(stderr, "This test is not applicable for max num_threads='%d'\n",78            omp_get_max_threads());79    return 0;80  }81 82}83