brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.6 KiB · f1763ec Raw
114 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 untied9#define PTASK_FLAG_DETACHABLE 0x4010 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#ifdef __cplusplus56extern "C" {57#endif58extern int __kmpc_global_thread_num(void *id_ref);59extern ptask __kmpc_omp_task_alloc(id *loc, int gtid, int flags,60                                   size_t sz, size_t shar, task_entry_t rtn);61extern int __kmpc_omp_task(id *loc, int gtid, ptask task);62extern omp_event_handle_t __kmpc_task_allow_completion_event(63                              ident_t *loc_ref, int gtid, ptask task);64#if __cplusplus65}66#endif67 68int volatile checker;69 70// User's code, outlined into task entry71int task_entry(int gtid, ptask task) {72  checker = 1;73  return 0;74}75 76int main() {77  int i, j, gtid = __kmpc_global_thread_num(NULL);78  int nt = omp_get_max_threads();79  ptask task;80  pshareds psh;81  checker = 0;82  omp_set_dynamic(0);83  #pragma omp parallel //num_threads(N)84  {85    #pragma omp master86    {87      int gtid = __kmpc_global_thread_num(NULL);88      omp_event_handle_t evt;89/*90      #pragma omp task detach(evt)91      {}92*/93      task = (ptask)__kmpc_omp_task_alloc(NULL,gtid,PTASK_FLAG_DETACHABLE,sizeof(struct task),sizeof(struct shar),&task_entry);94      psh = task->shareds;95      evt = (omp_event_handle_t)__kmpc_task_allow_completion_event(NULL,gtid,task);96      task->evt = evt;97 98      __kmpc_omp_task(NULL, gtid, task);99      my_sleep(2.0);100      omp_fulfill_event(evt);101 102    } // end master103  } // end parallel104 105  // check results106  if (checker == 1) {107    printf("passed\n");108    return 0;109  } else {110    printf("failed\n");111    return 1;112  }113}114