brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.3 KiB · bf41d94 Raw
139 lines · c
1// RUN: %libomp-compile && env OMP_NUM_THREADS='3' %libomp-run2// RUN: %libomp-compile && env OMP_NUM_THREADS='1' %libomp-run3// The runtime currently does not get dependency information from GCC.4// UNSUPPORTED: gcc5 6#include <stdio.h>7#include <omp.h>8#include "omp_my_sleep.h"9 10// detached untied11#define PTASK_FLAG_DETACHABLE 0x4012 13// OpenMP RTL interfaces14typedef unsigned long long kmp_uint64;15typedef long long kmp_int64;16 17typedef struct ID {18  int reserved_1;19  int flags;20  int reserved_2;21  int reserved_3;22  char *psource;23} id;24 25// Compiler-generated code (emulation)26typedef struct ident {27  void* dummy; // not used in the library28} ident_t;29 30typedef enum kmp_event_type_t {31  KMP_EVENT_UNINITIALIZED = 0,32  KMP_EVENT_ALLOW_COMPLETION = 133} kmp_event_type_t;34 35typedef struct {36  kmp_event_type_t type;37  union {38    void *task;39  } ed;40} kmp_event_t;41 42typedef struct shar { // shareds used in the task43} *pshareds;44 45typedef struct task {46  pshareds shareds;47  int(*routine)(int,struct task*);48  int part_id;49// void *destructor_thunk; // optional, needs flag setting if provided50// int priority; // optional, needs flag setting if provided51// ------------------------------52// privates used in the task:53  omp_event_handle_t evt;54} *ptask, kmp_task_t;55 56typedef struct DEP {57  size_t addr;58  size_t len;59  unsigned char flags;60} dep;61 62typedef int(* task_entry_t)( int, ptask );63 64#ifdef __cplusplus65extern "C" {66#endif67extern int  __kmpc_global_thread_num(void *id_ref);68extern int** __kmpc_omp_task_alloc(id *loc, int gtid, int flags,69                                   size_t sz, size_t shar, task_entry_t rtn);70extern int __kmpc_omp_task_with_deps(id *loc, int gtid, ptask task, int nd,71               dep *dep_lst, int nd_noalias, dep *noalias_dep_lst);72extern int __kmpc_omp_task(id *loc, int gtid, kmp_task_t *task);73extern omp_event_handle_t __kmpc_task_allow_completion_event(74                              ident_t *loc_ref, int gtid, kmp_task_t *task);75#ifdef __cplusplus76}77#endif78 79int volatile checker;80 81// User's code, outlined into task entry82int task_entry(int gtid, ptask task) {83  checker = 1;84  return 0;85}86 87int main() {88  int i, j, gtid = __kmpc_global_thread_num(NULL);89  int nt = omp_get_max_threads();90  ptask task;91  pshareds psh;92  checker = 0;93  omp_set_dynamic(0);94  #pragma omp parallel //num_threads(N)95  {96    #pragma omp master97    {98      #pragma omp task depend(inout:nt)99      {100        my_sleep(2.0);101      }102      int gtid = __kmpc_global_thread_num(NULL);103      omp_event_handle_t evt;104/*105      #pragma omp task detach(evt)106      {}107*/108      task = (ptask)__kmpc_omp_task_alloc(NULL,gtid,PTASK_FLAG_DETACHABLE,109                        sizeof(struct task),sizeof(struct shar),&task_entry);110      psh = task->shareds;111      evt = (omp_event_handle_t)__kmpc_task_allow_completion_event(NULL,gtid,task);112      task->evt = evt;113 114      dep sdep;115      sdep.addr = (size_t)&nt;116      sdep.len = 0L;117      sdep.flags = 3;118 119      __kmpc_omp_task_with_deps(NULL,gtid,task,1,&sdep,0,0);120      //__kmpc_omp_task(NULL, gtid, task);121 122      omp_fulfill_event(evt);123 124      #pragma omp taskwait125      ;126//      printf("after tw %d\n", omp_get_thread_num());127    } // end master128  } // end parallel129 130  // check results131  if (checker == 1) {132    printf("passed\n");133    return 0;134  } else {135    printf("failed\n");136    return 1;137  }138}139