brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.3 KiB · ef2ae20 Raw
136 lines · c
1/* Global headerfile of the OpenMP Testsuite */2 3#ifndef OMP_TESTSUITE_H4#define OMP_TESTSUITE_H5 6#include <stdio.h>7#include <stdlib.h>8#include <omp.h>9 10/* General                                                */11/**********************************************************/12#define LOOPCOUNT 1000 /* Number of iterations to slit amongst threads */13#define REPETITIONS 10 /* Number of times to run each test */14 15/* following times are in seconds */16#define SLEEPTIME 117 18/* Definitions for tasks                                  */19/**********************************************************/20#define NUM_TASKS 2521#define MAX_TASKS_PER_THREAD 522 23// Functions that call a parallel region that does very minimal work24// Some compilers may optimize away an empty parallel region25volatile int g_counter__;26 27// If nthreads == 0, then do not use num_threads() clause28static void go_parallel() {29  g_counter__ = 0;30  #pragma omp parallel31  {32    #pragma omp atomic33    g_counter__++;34  }35}36 37static void go_parallel_nthreads(int nthreads) {38  g_counter__ = 0;39  #pragma omp parallel num_threads(nthreads)40  {41    #pragma omp atomic42    g_counter__++;43  }44}45 46static void go_parallel_spread() {47  g_counter__ = 0;48  #pragma omp parallel proc_bind(spread)49  {50    #pragma omp atomic51    g_counter__++;52  }53}54 55static void go_parallel_close() {56  g_counter__ = 0;57  #pragma omp parallel proc_bind(close)58  {59    #pragma omp atomic60    g_counter__++;61  }62}63 64static void go_parallel_master() {65  g_counter__ = 0;66  #pragma omp parallel proc_bind(master)67  {68    #pragma omp atomic69    g_counter__++;70  }71}72 73static inline int get_exit_value() {74  return ((g_counter__ == -1) ? EXIT_FAILURE : EXIT_SUCCESS);75}76 77#ifdef  _WIN3278// Windows versions of pthread_create() and pthread_join()79# include <windows.h>80typedef HANDLE pthread_t;81 82// encapsulates the information about a pthread-callable function83struct thread_func_info_t {84  void* (*start_routine)(void*);85  void* arg;86};87 88// call the void* start_routine(void*);89static DWORD WINAPI __thread_func_wrapper(LPVOID lpParameter) {90  struct thread_func_info_t* function_information;91  function_information = (struct thread_func_info_t*)lpParameter;92  function_information->start_routine(function_information->arg);93  free(function_information);94  return 0;95}96 97// attr is ignored98static int pthread_create(pthread_t *thread, void *attr,99                          void *(*start_routine) (void *), void *arg) {100  pthread_t pthread;101  struct thread_func_info_t* info;102  info = (struct thread_func_info_t*)malloc(sizeof(struct thread_func_info_t));103  info->start_routine = start_routine;104  info->arg = arg;105  pthread = CreateThread(NULL, 0, __thread_func_wrapper, info, 0, NULL);106  if (pthread == NULL) {107    fprintf(stderr, "CreateThread() failed: Error #%u.\n",108            (unsigned) GetLastError());109    exit(1);110  }111  *thread = pthread;112  return 0;113}114// retval is ignored for now115static int pthread_join(pthread_t thread, void **retval) {116  int rc;117  rc = WaitForSingleObject(thread, INFINITE);118  if (rc == WAIT_FAILED) {119    fprintf(stderr, "WaitForSingleObject() failed: Error #%u.\n",120            (unsigned) GetLastError());121    exit(1);122  }123  rc = CloseHandle(thread);124  if (rc == 0) {125    fprintf(stderr, "CloseHandle() failed: Error #%u.\n",126            (unsigned) GetLastError());127    exit(1);128  }129  return 0;130}131#else132# include <pthread.h>133#endif134 135#endif136