brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.8 KiB · b3cc4c3 Raw
161 lines · c
1// RUN: %libomp-compile-and-run2 3#include <stdio.h>4#include <stdlib.h>5#include <string.h>6#include <omp.h>7 8#define XSTR(x) #x9#define STR(x) XSTR(x)10 11#define streqls(s1, s2) (!strcmp(s1, s2))12 13#define check(condition)                                                       \14  if (!(condition)) {                                                          \15    fprintf(stderr, "error: %s: %d: " STR(condition) "\n", __FILE__,           \16            __LINE__);                                                         \17    exit(1);                                                                   \18  }19 20#if defined(_WIN32)21#include <windows.h>22#include <process.h>23#define getpid _getpid24#ifndef __MINGW32__25typedef int pid_t;26#endif27#define gettid GetCurrentThreadId28#define my_gethostname(buf, sz) GetComputerNameA(buf, &(sz))29#else30#include <unistd.h>31#include <sys/types.h>32#define my_gethostname(buf, sz) gethostname(buf, sz)33#endif34 35#define BUFFER_SIZE 25636 37int get_integer() {38  int n, retval;39  char buf[BUFFER_SIZE];40  size_t needed = omp_capture_affinity(buf, BUFFER_SIZE, NULL);41  check(needed < BUFFER_SIZE);42  n = sscanf(buf, "%d", &retval);43  check(n == 1);44  return retval;45}46 47char* get_string() {48  int n, retval;49  char buf[BUFFER_SIZE];50  size_t needed = omp_capture_affinity(buf, BUFFER_SIZE, NULL);51  check(needed < BUFFER_SIZE);52  return strdup(buf);53}54 55void check_integer(const char* formats[2], int(*func)()) {56  int i;57  for (i = 0; i < 2; ++i) {58    omp_set_affinity_format(formats[i]);59    #pragma omp parallel num_threads(8)60    {61      check(get_integer() == func());62      #pragma omp parallel num_threads(3)63      {64        check(get_integer() == func());65      }66      check(get_integer() == func());67    }68  }69}70 71void check_nesting_level() {72  // Check %{nesting_level} and %L73  const char* formats[2] = {"%{nesting_level}", "%L"};74  check_integer(formats, omp_get_level);75}76 77void check_thread_num() {78  // Check %{thread_num} and %n79  const char* formats[2] = {"%{thread_num}", "%n"};80  check_integer(formats, omp_get_thread_num);81}82 83void check_num_threads() {84  // Check %{num_threads} and %N85  const char* formats[2] = {"%{num_threads}", "%N"};86  check_integer(formats, omp_get_num_threads);87}88 89int ancestor_helper() {90  return omp_get_ancestor_thread_num(omp_get_level() - 1);91}92void check_ancestor_tnum() {93  // Check %{ancestor_tnum} and %a94  const char* formats[2] = {"%{ancestor_tnum}", "%a"};95  check_integer(formats, ancestor_helper);96}97 98int my_get_pid() { return (int)getpid(); }99void check_process_id() {100  // Check %{process_id} and %P101  const char* formats[2] = {"%{process_id}", "%P"};102  check_integer(formats, my_get_pid);103}104 105/*106int my_get_tid() { return (int)gettid(); }107void check_native_thread_id() {108  // Check %{native_thread_id} and %i109  const char* formats[2] = {"%{native_thread_id}", "%i"};110  check_integer(formats, my_get_tid);111}112*/113 114void check_host() {115#ifdef _WIN32116  typedef DWORD buffer_size_t;117#else118  typedef int buffer_size_t;119#endif120  int i;121  buffer_size_t buffer_size = 256;122  const char* formats[2] = {"%{host}", "%H"};123  char hostname[256];124  my_gethostname(hostname, buffer_size);125  for (i = 0; i < 2; ++i) {126    omp_set_affinity_format(formats[i]);127    #pragma omp parallel num_threads(8)128    {129      char* host = get_string();130      check(streqls(host, hostname));131      free(host);132    }133  }134}135 136void check_undefined() {137  int i;138  const char* formats[2] = {"%{foobar}", "%X"};139  for (i = 0; i < 2; ++i) {140    omp_set_affinity_format(formats[i]);141    #pragma omp parallel num_threads(8)142    {143      char* undef = get_string();144      check(streqls(undef, "undefined"));145      free(undef);146    }147  }148}149 150int main(int argc, char** argv) {151  omp_set_nested(1);152  check_nesting_level();153  check_num_threads();154  check_ancestor_tnum();155  check_process_id();156  //check_native_thread_id();157  check_host();158  check_undefined();159  return 0;160}161