Please use GitHub pull requests for new patches. Phabricator shutdown timeline
Changeset View
Changeset View
Standalone View
Standalone View
openmp/runtime/test/tasking/bug_proxy_task_dep_waiting.c
Show All 11 Lines | |||||
#include "omp_my_sleep.h" | #include "omp_my_sleep.h" | ||||
/* | /* | ||||
An explicit task can have a dependency on a target task. If it is not | An explicit task can have a dependency on a target task. If it is not | ||||
directly satisfied, the runtime should not wait but resume execution. | directly satisfied, the runtime should not wait but resume execution. | ||||
*/ | */ | ||||
// Compiler-generated code (emulation) | // Compiler-generated code (emulation) | ||||
#ifdef _WIN64 | |||||
typedef long long kmp_intptr_t; | |||||
#else | |||||
typedef long kmp_intptr_t; | typedef long kmp_intptr_t; | ||||
#endif | |||||
typedef int kmp_int32; | typedef int kmp_int32; | ||||
typedef unsigned char kmp_uint8; | |||||
jlpeyton: Same as previous comment. | |||||
typedef char bool; | typedef char bool; | ||||
// These structs need to match the implementation within libomp, in kmp.h. | |||||
typedef struct ident { | typedef struct ident { | ||||
kmp_int32 reserved_1; /**< might be used in Fortran; see above */ | kmp_int32 reserved_1; /**< might be used in Fortran; see above */ | ||||
kmp_int32 flags; /**< also f.flags; KMP_IDENT_xxx flags; KMP_IDENT_KMPC identifies this union member */ | kmp_int32 flags; /**< also f.flags; KMP_IDENT_xxx flags; KMP_IDENT_KMPC identifies this union member */ | ||||
kmp_int32 reserved_2; /**< not really used in Fortran any more; see above */ | kmp_int32 reserved_2; /**< not really used in Fortran any more; see above */ | ||||
#if USE_ITT_BUILD | #if USE_ITT_BUILD | ||||
/* but currently used for storing region-specific ITT */ | /* but currently used for storing region-specific ITT */ | ||||
/* contextual information. */ | /* contextual information. */ | ||||
#endif /* USE_ITT_BUILD */ | #endif /* USE_ITT_BUILD */ | ||||
kmp_int32 reserved_3; /**< source[4] in Fortran, do not use for C++ */ | kmp_int32 reserved_3; /**< source[4] in Fortran, do not use for C++ */ | ||||
char const *psource; /**< String describing the source location. | char const *psource; /**< String describing the source location. | ||||
The string is composed of semi-colon separated fields which describe the source file, | The string is composed of semi-colon separated fields which describe the source file, | ||||
the function and a pair of line numbers that delimit the construct. | the function and a pair of line numbers that delimit the construct. | ||||
*/ | */ | ||||
} ident_t; | } ident_t; | ||||
typedef struct kmp_depend_info { | typedef struct kmp_depend_info { | ||||
kmp_intptr_t base_addr; | kmp_intptr_t base_addr; | ||||
size_t len; | size_t len; | ||||
struct { | union { | ||||
bool in:1; | kmp_uint8 flag; // flag as an unsigned char | ||||
bool out:1; | struct { // flag as a set of 8 bits | ||||
unsigned in : 1; | |||||
unsigned out : 1; | |||||
unsigned mtx : 1; | |||||
unsigned set : 1; | |||||
unsigned unused : 3; | |||||
unsigned all : 1; | |||||
} flags; | } flags; | ||||
}; | |||||
} kmp_depend_info_t; | } kmp_depend_info_t; | ||||
struct kmp_task; | struct kmp_task; | ||||
typedef kmp_int32 (* kmp_routine_entry_t)( kmp_int32, struct kmp_task * ); | typedef kmp_int32 (* kmp_routine_entry_t)( kmp_int32, struct kmp_task * ); | ||||
typedef struct kmp_task { /* GEH: Shouldn't this be aligned somehow? */ | typedef struct kmp_task { /* GEH: Shouldn't this be aligned somehow? */ | ||||
void * shareds; /**< pointer to block of pointers to shared vars */ | void * shareds; /**< pointer to block of pointers to shared vars */ | ||||
kmp_routine_entry_t routine; /**< pointer to routine to call for executing task */ | kmp_routine_entry_t routine; /**< pointer to routine to call for executing task */ | ||||
Show All 40 Lines | |||||
/* | /* | ||||
* Corresponds to: | * Corresponds to: | ||||
#pragma omp target nowait depend(out: dep) | #pragma omp target nowait depend(out: dep) | ||||
{ | { | ||||
my_sleep( 0.1 ); | my_sleep( 0.1 ); | ||||
} | } | ||||
*/ | */ | ||||
kmp_depend_info_t dep_info; | kmp_depend_info_t dep_info = { 0 }; | ||||
dep_info.base_addr = (long) &dep; | dep_info.base_addr = (kmp_intptr_t) &dep; | ||||
dep_info.len = sizeof(int); | dep_info.len = sizeof(int); | ||||
// out = inout per spec and runtime expects this | // out = inout per spec and runtime expects this | ||||
dep_info.flags.in = 1; | dep_info.flags.in = 1; | ||||
dep_info.flags.out = 1; | dep_info.flags.out = 1; | ||||
kmp_int32 gtid = __kmpc_global_thread_num(NULL); | kmp_int32 gtid = __kmpc_global_thread_num(NULL); | ||||
kmp_task_t *proxy_task = __kmpc_omp_task_alloc(NULL,gtid,17,sizeof(kmp_task_t),0,&task_entry); | kmp_task_t *proxy_task = __kmpc_omp_task_alloc(NULL,gtid,17,sizeof(kmp_task_t),0,&task_entry); | ||||
__kmpc_omp_task_with_deps(NULL,gtid,proxy_task,1,&dep_info,0,NULL); | __kmpc_omp_task_with_deps(NULL,gtid,proxy_task,1,&dep_info,0,NULL); | ||||
Show All 26 Lines |
Same as previous comment.