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