brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.8 KiB · 66fcb8f Raw
117 lines · c
1// RUN: %libomp-compile && env OMP_NUM_THREADS='3' %libomp-run2// RUN: %libomp-compile && env OMP_NUM_THREADS='1' %libomp-run3 4#include <stdio.h>5#include <omp.h>6#include "omp_my_sleep.h"7 8// detached tied9#define PTASK_FLAG_DETACHABLE 0x4110 11// OpenMP RTL interfaces12typedef unsigned long long kmp_uint64;13typedef long long kmp_int64;14 15typedef struct ID {16  int reserved_1;17  int flags;18  int reserved_2;19  int reserved_3;20  char *psource;21} id;22 23// Compiler-generated code (emulation)24typedef struct ident {25  void* dummy; // not used in the library26} ident_t;27 28typedef enum kmp_event_type_t {29  KMP_EVENT_UNINITIALIZED = 0,30  KMP_EVENT_ALLOW_COMPLETION = 131} kmp_event_type_t;32 33typedef struct {34  kmp_event_type_t type;35  union {36    void *task;37  } ed;38} kmp_event_t;39 40typedef struct shar { // shareds used in the task41} *pshareds;42 43typedef struct task {44  pshareds shareds;45  int(*routine)(int,struct task*);46  int part_id;47// void *destructor_thunk; // optional, needs flag setting if provided48// int priority; // optional, needs flag setting if provided49// ------------------------------50// privates used in the task:51  omp_event_handle_t evt;52} *ptask, kmp_task_t;53 54typedef int(* task_entry_t)( int, ptask );55 56#ifdef __cplusplus57extern "C" {58#endif59extern int  __kmpc_global_thread_num(void *id_ref);60extern int** __kmpc_omp_task_alloc(id *loc, int gtid, int flags,61                                   size_t sz, size_t shar, task_entry_t rtn);62extern int __kmpc_omp_task(id *loc, int gtid, kmp_task_t *task);63extern omp_event_handle_t __kmpc_task_allow_completion_event(64                              ident_t *loc_ref, int gtid, kmp_task_t *task);65#ifdef __cplusplus66}67#endif68 69int volatile checker;70 71// User's code, outlined into task entry72int task_entry(int gtid, ptask task) {73  my_sleep(2.0);74  checker = 1;75  return 0;76}77 78int main() {79  int i, j, gtid = __kmpc_global_thread_num(NULL);80  int nt = omp_get_max_threads();81  ptask task;82  pshareds psh;83  checker = 0;84  omp_set_dynamic(0);85  #pragma omp parallel //num_threads(N)86  {87    #pragma omp master88    {89      int gtid = __kmpc_global_thread_num(NULL);90      omp_event_handle_t evt;91/*92      #pragma omp task detach(evt)93      {}94*/95      task = (ptask)__kmpc_omp_task_alloc(NULL,gtid,PTASK_FLAG_DETACHABLE,96                        sizeof(struct task),sizeof(struct shar),&task_entry);97      psh = task->shareds;98      evt = (omp_event_handle_t)__kmpc_task_allow_completion_event(NULL,gtid,task);99      task->evt = evt;100      __kmpc_omp_task(NULL, gtid, task);101      omp_fulfill_event(evt);102      #pragma omp taskwait103      ;104//      printf("after tw %d\n", omp_get_thread_num());105    } // end master106  } // end parallel107 108  // check results109  if (checker == 1) {110    printf("passed\n");111    return 0;112  } else {113    printf("failed\n");114    return 1;115  }116}117