diff options
Diffstat (limited to 'final/runtime/test/misc_bugs/teams-reduction.c')
-rw-r--r-- | final/runtime/test/misc_bugs/teams-reduction.c | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/final/runtime/test/misc_bugs/teams-reduction.c b/final/runtime/test/misc_bugs/teams-reduction.c new file mode 100644 index 0000000..6d7cd11 --- /dev/null +++ b/final/runtime/test/misc_bugs/teams-reduction.c @@ -0,0 +1,68 @@ +// RUN: %libomp-compile-and-run +// +// The test checks the teams construct with reduction executed on the host. +// + +#include <stdio.h> +#include <omp.h> + +#include <stdint.h> + +#ifndef N_TEAMS +#define N_TEAMS 4 +#endif +#ifndef N_THR +#define N_THR 3 +#endif + +// Internal library stuff to emulate compiler's code generation: +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + int32_t reserved_1; + int32_t flags; + int32_t reserved_2; + int32_t reserved_3; + char const *psource; +} ident_t; + +static ident_t dummy_loc = {0, 2, 0, 0, ";dummyFile;dummyFunc;0;0;;"}; + +typedef union { + // The global will be used as pointer, so we need to make sure that the + // compiler correctly aligns the global... + void *ptr; + int32_t data[8]; +} kmp_critical_name; +kmp_critical_name crit; + +int32_t __kmpc_global_thread_num(ident_t *); +void __kmpc_push_num_teams(ident_t *, int32_t global_tid, int32_t num_teams, + int32_t num_threads); +void __kmpc_fork_teams(ident_t *, int32_t argc, void *microtask, ...); +int32_t __kmpc_reduce(ident_t *, int32_t global_tid, int32_t num_vars, + size_t reduce_size, void *reduce_data, void *reduce_func, + kmp_critical_name *lck); +void __kmpc_end_reduce(ident_t *, int32_t global_tid, kmp_critical_name *lck); + +#ifdef __cplusplus +} +#endif + +// Outlined entry point: +void outlined(int32_t *gtid, int32_t *tid) { + int32_t ret = __kmpc_reduce(&dummy_loc, *gtid, 0, 0, NULL, NULL, &crit); + __kmpc_end_reduce(&dummy_loc, *gtid, &crit); +} + +int main() { + int32_t th = __kmpc_global_thread_num(NULL); // registers initial thread + __kmpc_push_num_teams(&dummy_loc, th, N_TEAMS, N_THR); + __kmpc_fork_teams(&dummy_loc, 0, &outlined); + + // Test did not hang -> passed! + printf("passed\n"); + return 0; +} |