From 9acb8b06de8c5a5f902af689acc944e3ff3a62c8 Mon Sep 17 00:00:00 2001 From: Kevin Pouget <kevin.pouget@imag.fr> Date: Thu, 18 Feb 2016 16:40:25 +0100 Subject: [PATCH] improve --- __init__.py | 17 +- main.py => __main__.py | 0 mcgdb_testing/Makefile | 8 + mcgdb_testing/benchmark.c | 76 ++ mcgdb_testing/mc_gdb.py | 39 + mcgdb_testing/native_gdb.py | 75 ++ openmp_testing/Makefile | 53 ++ openmp_testing/__binaries__/.is_gcc | 0 .../__binaries__/.tmp/mcc_parallel-demo.c | 674 ++++++++++++++++++ openmp_testing/__binaries__/benchmark | Bin 0 -> 15440 bytes openmp_testing/__binaries__/parallel-demo | Bin 0 -> 11600 bytes openmp_testing/__init__.py | 4 + openmp_testing/benchmark.c | 168 +++++ openmp_testing/benchmark.py | 36 + openmp_testing/count.py | 37 + openmp_testing/no_instrumentation.py | 31 + openmp_testing/opm_seq_print.expected | 7 + openmp_testing/opm_seq_print_all.expected | 67 ++ openmp_testing/parallel-demo.c | 69 ++ openmp_testing/sequence.py | 16 + openmp_testing/stepping.py | 18 + 21 files changed, 1391 insertions(+), 4 deletions(-) rename main.py => __main__.py (100%) create mode 100644 mcgdb_testing/Makefile create mode 100644 mcgdb_testing/benchmark.c create mode 100644 mcgdb_testing/mc_gdb.py create mode 100644 mcgdb_testing/native_gdb.py create mode 100644 openmp_testing/Makefile create mode 100644 openmp_testing/__binaries__/.is_gcc create mode 100644 openmp_testing/__binaries__/.tmp/mcc_parallel-demo.c create mode 100755 openmp_testing/__binaries__/benchmark create mode 100755 openmp_testing/__binaries__/parallel-demo create mode 100644 openmp_testing/__init__.py create mode 100644 openmp_testing/benchmark.c create mode 100644 openmp_testing/benchmark.py create mode 100644 openmp_testing/count.py create mode 100644 openmp_testing/no_instrumentation.py create mode 100644 openmp_testing/opm_seq_print.expected create mode 100644 openmp_testing/opm_seq_print_all.expected create mode 100644 openmp_testing/parallel-demo.c create mode 100644 openmp_testing/sequence.py create mode 100644 openmp_testing/stepping.py diff --git a/__init__.py b/__init__.py index 2e73112..83345fb 100644 --- a/__init__.py +++ b/__init__.py @@ -20,9 +20,16 @@ def all_subpackages(pkg_prefix, verbose, what_to_run, parent, prefix=""): if ".testing" not in modname and not ispkg: continue - + mod = importlib.import_module(modname) - + try: + if os.path.islink(mod.__path__[0] if ispkg else mod.__file__): + log.warn("Skipping symbolic link to {}.".format(modname)) + # might be better to check if it is in the path first ... + continue + except Exception as e: + import pdb;pdb.set_trace() + pass for what in what_to_run: if not hasattr(mod, what): continue @@ -108,8 +115,10 @@ def run_module(verbose, modname, mod, do_that): print(title) print("#" * len(title)) - try: run_once() - except FinishException: pass + try: + run_once() + except FinishException: + pass else: print("# "+modname) GDB_Instance.CSV_header = True diff --git a/main.py b/__main__.py similarity index 100% rename from main.py rename to __main__.py diff --git a/mcgdb_testing/Makefile b/mcgdb_testing/Makefile new file mode 100644 index 0000000..28a8f03 --- /dev/null +++ b/mcgdb_testing/Makefile @@ -0,0 +1,8 @@ +BIN_DIR ?= __binaries__ + +CFLAGS=-g -O0 + +benchmark : $(BIN_DIR)/benchmark + +$(BIN_DIR)/benchmark : benchmark.c + gcc -o $@ $< ${CFLAGS} diff --git a/mcgdb_testing/benchmark.c b/mcgdb_testing/benchmark.c new file mode 100644 index 0000000..80b9975 --- /dev/null +++ b/mcgdb_testing/benchmark.c @@ -0,0 +1,76 @@ +#include <stdio.h> +#include <stdlib.h> +#include <sys/time.h> +#include <unistd.h> + +/***********/ +// modified by debugging, do not change to macro. +int repeat = 2; + +int it_count = 1000; +int us_sleep_time = 100; + +/***********/ + +void finish_data_ready(void) {} + +void finish(struct timeval x, struct timeval y) { + + static float it_total; + static float ms_busy_time, us_busy_once; + static float ms_total_sleep; + static float ms_time; + { + static double x_us, y_us; + + x_us = (double) x.tv_sec*1000000 + (double) x.tv_usec; + y_us = (double) y.tv_sec*1000000 + (double) y.tv_usec; + + it_total = repeat * it_count; + + ms_time = (y_us - x_us)/1000; + ms_total_sleep = us_sleep_time*(it_total/1000.0); + ms_busy_time = ms_time - ms_total_sleep; + us_busy_once = ms_busy_time * 1000 / it_total; + } + + finish_data_ready(); + + printf("Repeat: %d; Loop: %d; usleep %dus (one) %1.fms (total)\n", + repeat, it_count, us_sleep_time, ms_total_sleep); + printf("------------------\n"); + printf("Total time: %1.fms\n", ms_time); + printf("Busy time : %1.fms\n", ms_busy_time); + printf("Busy once : %1.fus\n", us_busy_once); +} + +void action(int it) { + usleep(us_sleep_time); +} + +void benchmark(void) { + static int i; + + for (i = 0; i < it_count; ++i) { + action(i); + } +} + +int main(int argc, char** argv) { + struct timeval before , after; + int i; + + benchmark(); // warm-up + + gettimeofday(&before , NULL); + + for (i = 0; i < repeat; ++i) { + benchmark(); + } + + gettimeofday(&after , NULL); + + finish(before, after); + + return EXIT_SUCCESS; +} diff --git a/mcgdb_testing/mc_gdb.py b/mcgdb_testing/mc_gdb.py new file mode 100644 index 0000000..cc75133 --- /dev/null +++ b/mcgdb_testing/mc_gdb.py @@ -0,0 +1,39 @@ +native_gdb = None +gdb = None + +TEST_FINISH_BP = """python +class TestFctBP(mcgdb.capture.FunctionBreakpoint): + do_finish = False + + def __init__(self): + mcgdb.capture.FunctionBreakpoint.__init__(self, "action") + + def prepare_before (self): + return (False, TestFctBP.do_finish, {}) + + def prepare_after(self, data): + return False +TestFctBP() +end +""" + +def function_breakpoint(): + gdb.execute(TEST_FINISH_BP) + native_gdb.run("Function Breakpoint") + +def finish_breakpoint(): + gdb.execute(TEST_FINISH_BP) + gdb.execute("python TestFctBP.do_finish = True") + + native_gdb.run("Finish Breakpoint") + +def prepare(_gdb): + gdb.execute("py import mcgdb") + +def benchmark(_gdb): + global native_gdb, gdb + from . import native_gdb + gdb = _gdb + what = [function_breakpoint, finish_breakpoint] + + native_gdb.benchmark(_gdb, what, no_mcgdb=False) diff --git a/mcgdb_testing/native_gdb.py b/mcgdb_testing/native_gdb.py new file mode 100644 index 0000000..56c5e97 --- /dev/null +++ b/mcgdb_testing/native_gdb.py @@ -0,0 +1,75 @@ +from gdb_tester import * + +gdb = None + +def run(what, run="run"): + gdb.set_title(what) + gdb.execute("break finish_data_ready") + gdb.execute(run) + gdb.execute("up") + + gdb.save_value("us_busy_once", "%1.f", "us") + +def nominal_time(): + run("Nominal time") + +def gdb_watchpoint(): + gdb.execute("break benchmark") + gdb.execute("run") + gdb.execute("print &i") + gdb.execute("watch *$1") + gdb.execute("""command +silent +continue +end""") + gdb.execute("py [b for b in gdb.breakpoints() if b.location == 'benchmark'][0].delete()") + + run("HW Watchpoint command", run="continue") + +def gdb_breakpoint(): + gdb.execute("break action") + gdb.execute("""command +silent +continue +end""") + run("Breakpoint command") + +PARAMETERS = [ + 'int(gdb.parse_and_eval("it"))', + 'int(gdb.newest_frame().older().read_var("i"))' + ] +def gdb_py_breakpoint_parameter(params_choice): + params = [par for i, par in enumerate(PARAMETERS) if params_choice & (1 << i)] + + def to_run(): + gdb.execute("""python +class TestBP(gdb.Breakpoint): + def __init__(self): + gdb.Breakpoint.__init__(self, "action") + self.silent=True + + def stop(self): + {params} + return False + +TestBP() +end +""".format(params="\n ".join(params))) + run("Py BP param {:02b}".format(params_choice)[2:]) + + return to_run + +def benchmark(_gdb, what=None, no_mcgdb=True): + global gdb + gdb = _gdb + + if what is None: + what = [nominal_time, gdb_breakpoint, gdb_watchpoint] + \ + list(map(lambda x: gdb_py_breakpoint_parameter(x), (0b0, 0b1, 0b10, 0b11))) + + gdb.start(CSource("benchmark.c"), no_mcgdb) + for prepare_and_run in what: + prepare_and_run() + gdb.reset(hard=(not no_mcgdb)) + + gdb.quit() diff --git a/openmp_testing/Makefile b/openmp_testing/Makefile new file mode 100644 index 0000000..92f6359 --- /dev/null +++ b/openmp_testing/Makefile @@ -0,0 +1,53 @@ +BIN_DIR ?= __binaries__ +CFLAGS=-g -O0 + +GOMP ?= yes + +LLVM ?= no +MY_CLANG_DIR = /home/kevin/travail/sample/LLVM/llvm/Debug+Asserts/bin + +OMPSS ?= no +MY_OMPSS_DIR = ~/travail/tools/ompss-install/bin +OMPSS_TMP_DBG_DIR = $(BIN_DIR)/.tmp/ + +ifeq ($(LLVM),yes) + CFLAGS += -fopenmp + CC = ${MY_CLANG_DIR}/clang + +# -- -- -- + IMPLEM_CHECK= $(BIN_DIR)/.is_llvm + IMPLEM_NCHECK= $(BIN_DIR)/.is_gcc IMPLEM_CHECK= $(BIN_DIR)/.is_ompss +endif + +ifeq ($(GOMP),yes) + CFLAGS += -fdump-tree-optimized -fopenmp + CC = gcc +# -- -- -- + IMPLEM_CHECK= $(BIN_DIR)/.is_gcc + IMPLEM_NCHECK= $(BIN_DIR)/.is_llvm IMPLEM_CHECK= $(BIN_DIR)/.is_ompss +endif + +ifeq ($(OMPSS),yes) + CFLAGS += --debug --keep-files --output-dir=${OMPSS_TMP_DBG_DIR} --keep-files + CC = ${MY_OMPSS_DIR}/mcc +# -- -- -- + IMPLEM_CHECK= $(BIN_DIR)/.is_ompss + IMPLEM_NCHECK= $(BIN_DIR)/.is_llvm $(BIN_DIR)/.is_gcc +endif + +.SUFFIXES: # disable implicit rules + +parallel-demo : $(BIN_DIR)/parallel-demo + +$(BIN_DIR)/parallel-demo : parallel-demo.c $(IMPLEM_CHECK) + @mkdir -p ${OMPSS_TMP_DBG_DIR} + ${CC} -o $@ $< ${CFLAGS} + @rm $(IMPLEM_NCHECK) -f + +$(IMPLEM_CHECK) : + @touch $(IMPLEM_CHECK) + +benchmark : $(BIN_DIR)/benchmark + +$(BIN_DIR)/benchmark : benchmark.c + gcc -o $@ $< -fopenmp ${CFLAGS} diff --git a/openmp_testing/__binaries__/.is_gcc b/openmp_testing/__binaries__/.is_gcc new file mode 100644 index 0000000..e69de29 diff --git a/openmp_testing/__binaries__/.tmp/mcc_parallel-demo.c b/openmp_testing/__binaries__/.tmp/mcc_parallel-demo.c new file mode 100644 index 0000000..25aabb7 --- /dev/null +++ b/openmp_testing/__binaries__/.tmp/mcc_parallel-demo.c @@ -0,0 +1,674 @@ +struct _IO_FILE_plus; +extern struct _IO_FILE_plus _IO_2_1_stdin_; +extern struct _IO_FILE_plus _IO_2_1_stdout_; +extern struct _IO_FILE_plus _IO_2_1_stderr_; +struct _IO_FILE; +extern struct _IO_FILE *stdin; +extern struct _IO_FILE *stdout; +extern struct _IO_FILE *stderr; +extern int sys_nerr; +extern const char *const sys_errlist[]; +extern int printf(const char *__restrict __format, ...); +struct mcc_struct_anon_15 +{ + void (*outline)(void *); +}; +typedef struct mcc_struct_anon_15 nanos_smp_args_t; +struct nanos_args_3_t +{ +}; +static void smp_ol_main_3(struct nanos_args_3_t *const args); +struct mcc_struct_anon_11 +{ + _Bool mandatory_creation:1; + _Bool tied:1; + _Bool clear_chunk:1; + _Bool reserved0:1; + _Bool reserved1:1; + _Bool reserved2:1; + _Bool reserved3:1; + _Bool reserved4:1; +}; +typedef struct mcc_struct_anon_11 nanos_wd_props_t; +typedef unsigned long int size_t; +struct nanos_const_wd_definition_tag +{ + nanos_wd_props_t props; + size_t data_alignment; + size_t num_copies; + size_t num_devices; + size_t num_dimensions; + const char *description; +}; +typedef struct nanos_const_wd_definition_tag nanos_const_wd_definition_t; +struct mcc_struct_anon_14 +{ + void *(*factory)(void *); + void *arg; +}; +typedef struct mcc_struct_anon_14 nanos_device_t; +struct nanos_const_wd_definition_1 +{ + nanos_const_wd_definition_t base; + nanos_device_t devices[1L]; +}; +extern void *nanos_smp_factory(void *args); +extern int nanos_omp_get_num_threads_next_parallel(int threads_requested); +typedef void *nanos_team_t; +typedef void *nanos_thread_t; +enum mcc_enum_anon_5 +{ + NANOS_OK = 0, + NANOS_UNKNOWN_ERR = 1, + NANOS_UNIMPLEMENTED = 2, + NANOS_ENOMEM = 3, + NANOS_INVALID_PARAM = 4, + NANOS_INVALID_REQUEST = 5 +}; +typedef enum mcc_enum_anon_5 nanos_err_t; +struct mcc_struct_anon_18; +typedef struct mcc_struct_anon_18 nanos_constraint_t; +typedef void *nanos_sched_t; +extern nanos_err_t nanos_create_team(nanos_team_t *team, nanos_sched_t sg, unsigned int *nthreads, nanos_constraint_t *constraints, _Bool reuse, nanos_thread_t *info, nanos_const_wd_definition_t *const_data); +extern void nanos_handle_error(nanos_err_t err); +struct mcc_struct_anon_12 +{ + _Bool is_final:1; + _Bool is_recover:1; + _Bool is_implicit:1; + _Bool reserved3:1; + _Bool reserved4:1; + _Bool reserved5:1; + _Bool reserved6:1; + _Bool reserved7:1; +}; +typedef struct mcc_struct_anon_12 nanos_wd_dyn_flags_t; +struct mcc_struct_anon_13 +{ + nanos_wd_dyn_flags_t flags; + nanos_thread_t tie_to; + int priority; +}; +typedef struct mcc_struct_anon_13 nanos_wd_dyn_props_t; +typedef void *nanos_wd_t; +struct mcc_struct_anon_4; +typedef struct mcc_struct_anon_4 nanos_copy_data_internal_t; +typedef nanos_copy_data_internal_t nanos_copy_data_t; +struct mcc_struct_anon_0; +typedef struct mcc_struct_anon_0 nanos_region_dimension_internal_t; +typedef void *nanos_wg_t; +extern nanos_err_t nanos_create_wd_compact(nanos_wd_t *wd, nanos_const_wd_definition_t *const_data, nanos_wd_dyn_props_t *dyn_props, size_t data_size, void **data, nanos_wg_t wg, nanos_copy_data_t **copies, nanos_region_dimension_internal_t **dimensions); +extern nanos_wd_t nanos_current_wd(void); +struct mcc_struct_anon_2; +typedef struct mcc_struct_anon_2 nanos_data_access_internal_t; +typedef nanos_data_access_internal_t nanos_data_access_t; +extern nanos_err_t nanos_submit(nanos_wd_t wd, size_t num_data_accesses, nanos_data_access_t *data_accesses, nanos_team_t team); +typedef void (*nanos_translate_args_t)(void *, nanos_wd_t); +extern nanos_err_t nanos_create_wd_and_run_compact(nanos_const_wd_definition_t *const_data, nanos_wd_dyn_props_t *dyn_props, size_t data_size, void *data, size_t num_data_accesses, nanos_data_access_t *data_accesses, nanos_copy_data_t *copies, nanos_region_dimension_internal_t *dimensions, nanos_translate_args_t translate_args); +struct mcc_struct_anon_1 +{ + _Bool input:1; + _Bool output:1; + _Bool can_rename:1; + _Bool concurrent:1; + _Bool commutative:1; +}; +typedef struct mcc_struct_anon_1 nanos_access_type_internal_t; +typedef long int ptrdiff_t; +struct mcc_struct_anon_2 +{ + void *address; + nanos_access_type_internal_t flags; + short int dimension_count; + const nanos_region_dimension_internal_t *dimensions; + ptrdiff_t offset; +}; +extern nanos_err_t nanos_end_team(nanos_team_t team); +int main() +{ + printf("@Base: Let\'s attack the death start !\n"); + printf("@Base: Releash all the starfighters.\n"); + { + nanos_err_t nanos_err; + nanos_wd_dyn_props_t dyn_props; + unsigned int nth_i; + struct nanos_args_3_t imm_args; + nanos_data_access_t dependences[1L]; + static nanos_smp_args_t smp_ol_main_3_args = {.outline = (void (*)(void *))(void (*)(struct nanos_args_3_t *))&smp_ol_main_3}; + static struct nanos_const_wd_definition_1 nanos_wd_const_data = {.base = {.props = {.mandatory_creation = 1, .tied = 1, .clear_chunk = 0, .reserved0 = 0, .reserved1 = 0, .reserved2 = 0, .reserved3 = 0, .reserved4 = 0}, .data_alignment = __alignof__(struct nanos_args_3_t), .num_copies = 0, .num_devices = 1, .num_dimensions = 0, .description = "main"}, .devices = {[0] = {.factory = &nanos_smp_factory, .arg = &smp_ol_main_3_args}}}; + unsigned int nanos_num_threads = nanos_omp_get_num_threads_next_parallel(0); + nanos_team_t nanos_team = (void *)0; + nanos_thread_t nanos_team_threads[nanos_num_threads]; + nanos_err = nanos_create_team(&nanos_team, (void *)0, &nanos_num_threads, (nanos_constraint_t *)0, 1, nanos_team_threads, &nanos_wd_const_data.base); + if (nanos_err != NANOS_OK) + { + nanos_handle_error(nanos_err); + } + dyn_props.tie_to = (void *)0; + dyn_props.priority = 0; + dyn_props.flags.is_final = 0; + dyn_props.flags.is_implicit = 1; + for (nth_i = 1; nth_i < nanos_num_threads; nth_i = nth_i + 1) + { + dyn_props.tie_to = nanos_team_threads[nth_i]; + struct nanos_args_3_t *ol_args = 0; + nanos_wd_t nanos_wd_ = (void *)0; + nanos_err = nanos_create_wd_compact(&nanos_wd_, &nanos_wd_const_data.base, &dyn_props, sizeof(struct nanos_args_3_t), (void **)&ol_args, nanos_current_wd(), (nanos_copy_data_t **)0, (nanos_region_dimension_internal_t **)0); + if (nanos_err != NANOS_OK) + { + nanos_handle_error(nanos_err); + } + ; + nanos_err = nanos_submit(nanos_wd_, 0, (nanos_data_access_t *)0, (void *)0); + if (nanos_err != NANOS_OK) + { + nanos_handle_error(nanos_err); + } + } + dyn_props.tie_to = nanos_team_threads[0]; + ; + nanos_err = nanos_create_wd_and_run_compact(&nanos_wd_const_data.base, &dyn_props, sizeof(struct nanos_args_3_t), &imm_args, 0, dependences, (nanos_copy_data_t *)0, (nanos_region_dimension_internal_t *)0, (void (*)(void *, nanos_wd_t))0); + if (nanos_err != NANOS_OK) + { + nanos_handle_error(nanos_err); + } + nanos_err = nanos_end_team(nanos_team); + if (nanos_err != NANOS_OK) + { + nanos_handle_error(nanos_err); + } + } + printf("@Base: Everybody\'s back to safety, great job!\n"); +} +static void smp_ol_main_0_unpacked(int id) +{ + { + { + printf("@%d I cover your backs!\n", id); + } + } +} +struct nanos_args_0_t +{ + int id; +}; +static void smp_ol_main_0(struct nanos_args_0_t *const args) +{ + { + smp_ol_main_0_unpacked((*args).id); + } +} +static void smp_ol_main_1_unpacked(int id) +{ + { + { + printf("@%d I cover your backs as well!\n", id); + } + } +} +struct nanos_args_1_t +{ + int id; +}; +static void smp_ol_main_1(struct nanos_args_1_t *const args) +{ + { + smp_ol_main_1_unpacked((*args).id); + } +} +struct nanos_ws_desc; +typedef struct nanos_ws_desc nanos_ws_desc_t; +extern nanos_err_t nanos_omp_set_implicit(nanos_wd_t uwd); +typedef void *nanos_ws_item_t; +extern nanos_err_t nanos_worksharing_next_item(nanos_ws_desc_t *wsd, nanos_ws_item_t *wsi); +struct mcc_struct_anon_10 +{ + int lower; + int upper; + _Bool execute:1; + _Bool last:1; +}; +typedef struct mcc_struct_anon_10 nanos_ws_item_loop_t; +extern nanos_err_t nanos_omp_barrier(void); +static void smp_ol_main_2_unpacked(nanos_ws_desc_t *wsd_1, int *const id) +{ + int nanos_omp_index_0; + { + { + nanos_err_t nanos_err; + nanos_err = nanos_omp_set_implicit(nanos_current_wd()); + if (nanos_err != NANOS_OK) + { + nanos_handle_error(nanos_err); + } + } + { + nanos_err_t nanos_err; + nanos_ws_item_loop_t nanos_item_loop; + nanos_err = nanos_worksharing_next_item(wsd_1, (void **)&nanos_item_loop); + if (nanos_err != NANOS_OK) + { + nanos_handle_error(nanos_err); + } + while (nanos_item_loop.execute) + { + for (nanos_omp_index_0 = nanos_item_loop.lower; nanos_omp_index_0 <= nanos_item_loop.upper; nanos_omp_index_0 += 1) + { + { + switch (nanos_omp_index_0) + { + case 0 : + { + printf("@%d I attack the energy field!\n", (*id)); + } + break; + case 1 : + { + printf("@%d I attack the generator!\n", (*id)); + } + break; + case 2 : + { + printf("@%d I follow the rabits!\n", (*id)); + } + break; + } + } + } + ; + nanos_err = nanos_worksharing_next_item(wsd_1, (void **)&nanos_item_loop); + } + } + { + nanos_err_t nanos_err; + nanos_err = nanos_omp_barrier(); + if (nanos_err != NANOS_OK) + { + nanos_handle_error(nanos_err); + } + } + } +} +struct nanos_args_2_t +{ + nanos_ws_desc_t *wsd_1; + int *id; +}; +static void smp_ol_main_2(struct nanos_args_2_t *const args) +{ + { + smp_ol_main_2_unpacked((*args).wsd_1, (*args).id); + } +} +extern nanos_err_t nanos_enter_team(void); +extern int omp_get_thread_num(void); +extern nanos_err_t nanos_omp_single(_Bool *); +struct nanos_lock_t; +typedef struct nanos_lock_t nanos_lock_t; +extern nanos_err_t nanos_set_lock(nanos_lock_t *lock); +enum mcc_enum_anon_4 +{ + NANOS_LOCK_FREE = 0, + NANOS_LOCK_BUSY = 1 +}; +typedef enum mcc_enum_anon_4 nanos_lock_state_t; +struct nanos_lock_t +{ + volatile nanos_lock_state_t state_; +}; +__attribute__((common)) nanos_lock_t nanos_default_critical_lock; +extern nanos_err_t nanos_unset_lock(nanos_lock_t *lock); +extern nanos_err_t nanos_in_final(_Bool *result); +typedef void *nanos_ws_t; +enum nanos_omp_sched_t +{ + nanos_omp_sched_static = 1, + nanos_omp_sched_dynamic = 2, + nanos_omp_sched_guided = 3, + nanos_omp_sched_auto = 4 +}; +typedef enum nanos_omp_sched_t nanos_omp_sched_t; +extern nanos_ws_t nanos_omp_find_worksharing(nanos_omp_sched_t kind); +struct mcc_struct_anon_9 +{ + int lower_bound; + int upper_bound; + int loop_step; + int chunk_size; +}; +typedef struct mcc_struct_anon_9 nanos_ws_info_loop_t; +typedef void *nanos_ws_info_t; +extern nanos_err_t nanos_worksharing_create(nanos_ws_desc_t **wsd, nanos_ws_t ws, nanos_ws_info_t *info, _Bool *b); +extern nanos_err_t nanos_team_get_num_supporting_threads(int *n); +extern nanos_err_t nanos_malloc(void **p, size_t size, const char *file, int line); +typedef void *nanos_ws_data_t; +struct nanos_ws_desc +{ + volatile nanos_ws_t ws; + nanos_ws_data_t data; + struct nanos_ws_desc *next; + nanos_thread_t *threads; + int nths; +}; +extern nanos_err_t nanos_team_get_supporting_threads(int *n, nanos_thread_t *list_of_threads); +typedef void *nanos_slicer_t; +extern nanos_slicer_t nanos_find_slicer(const char *slicer); +extern nanos_err_t nanos_create_sliced_wd(nanos_wd_t *uwd, size_t num_devices, nanos_device_t *devices, size_t outline_data_size, int outline_data_align, void **outline_data, nanos_wg_t uwg, nanos_slicer_t slicer, nanos_wd_props_t *props, nanos_wd_dyn_props_t *dyn_props, size_t num_copies, nanos_copy_data_t **copies, size_t num_dimensions, nanos_region_dimension_internal_t **dimensions); +extern nanos_err_t nanos_free(void *p); +extern int nanos_omp_get_thread_num(void); +extern nanos_err_t nanos_leave_team(void); +static void smp_ol_main_3_unpacked(void) +{ + { + nanos_err_t nanos_err; + nanos_err = nanos_omp_set_implicit(nanos_current_wd()); + if (nanos_err != NANOS_OK) + { + nanos_handle_error(nanos_err); + } + nanos_err = nanos_enter_team(); + if (nanos_err != NANOS_OK) + { + nanos_handle_error(nanos_err); + } + { + int id = omp_get_thread_num() + 1; + printf("@%d On the way to the combat zone.\n", id); + { + _Bool single_guard; + nanos_err_t nanos_err = nanos_omp_single(&single_guard); + if (nanos_err != NANOS_OK) + { + nanos_handle_error(nanos_err); + } + if (single_guard) + { + { + printf("@%d I opened a breach in the star,\n", id); + printf("@%d but we can only enter one by one.\n", id); + } + } + } + { + nanos_err_t nanos_err; + nanos_err = nanos_omp_barrier(); + if (nanos_err != NANOS_OK) + { + nanos_handle_error(nanos_err); + } + } + { + nanos_err_t nanos_err; + nanos_err = nanos_set_lock(&nanos_default_critical_lock); + if (nanos_err != NANOS_OK) + { + nanos_handle_error(nanos_err); + } + { + printf("@%d I\'m entering the breach\n", id); + } + nanos_err = nanos_unset_lock(&nanos_default_critical_lock); + if (nanos_err != NANOS_OK) + { + nanos_handle_error(nanos_err); + } + } + printf("\n@%d Someone needs to cover us!\n", id); + { + _Bool single_guard; + nanos_err_t nanos_err = nanos_omp_single(&single_guard); + if (nanos_err != NANOS_OK) + { + nanos_handle_error(nanos_err); + } + if (single_guard) + { + { + printf("@%d I give the orders\n", id); + { + _Bool mcc_is_in_final; + nanos_err_t mcc_err_in_final = nanos_in_final(&mcc_is_in_final); + if (mcc_err_in_final != NANOS_OK) + { + nanos_handle_error(mcc_err_in_final); + } + if (mcc_is_in_final) + { + { + printf("@%d I cover your backs!\n", id); + } + } + else + { + { + nanos_wd_dyn_props_t nanos_wd_dyn_props; + struct nanos_args_0_t *ol_args; + nanos_err_t nanos_err; + struct nanos_args_0_t imm_args; + nanos_data_access_t dependences[1L]; + static nanos_smp_args_t smp_ol_main_0_args = {.outline = (void (*)(void *))(void (*)(struct nanos_args_0_t *))&smp_ol_main_0}; + static struct nanos_const_wd_definition_1 nanos_wd_const_data = {.base = {.props = {.mandatory_creation = 0, .tied = 1, .clear_chunk = 0, .reserved0 = 0, .reserved1 = 0, .reserved2 = 0, .reserved3 = 0, .reserved4 = 0}, .data_alignment = __alignof__(struct nanos_args_0_t), .num_copies = 0, .num_devices = 1, .num_dimensions = 0, .description = "main"}, .devices = {[0] = {.factory = &nanos_smp_factory, .arg = &smp_ol_main_0_args}}}; + nanos_wd_dyn_props.tie_to = 0; + nanos_wd_dyn_props.priority = 0; + nanos_wd_dyn_props.flags.is_final = 0; + nanos_wd_dyn_props.flags.is_implicit = 0; + ol_args = (struct nanos_args_0_t *)0; + void *nanos_wd_ = (void *)0; + nanos_err = nanos_create_wd_compact(&nanos_wd_, &nanos_wd_const_data.base, &nanos_wd_dyn_props, sizeof(struct nanos_args_0_t), (void **)&ol_args, nanos_current_wd(), (nanos_copy_data_t **)0, (nanos_region_dimension_internal_t **)0); + if (nanos_err != NANOS_OK) + { + nanos_handle_error(nanos_err); + } + if (nanos_wd_ != (void *)0) + { + (*ol_args).id = id; + nanos_err = nanos_submit(nanos_wd_, 0, &dependences[0], (void *)0); + if (nanos_err != NANOS_OK) + { + nanos_handle_error(nanos_err); + } + } + else + { + imm_args.id = id; + nanos_err = nanos_create_wd_and_run_compact(&nanos_wd_const_data.base, &nanos_wd_dyn_props, sizeof(struct nanos_args_0_t), &imm_args, 0, &dependences[0], (nanos_copy_data_t *)0, (nanos_region_dimension_internal_t *)0, (void (*)(void *, void *))0); + if (nanos_err != NANOS_OK) + { + nanos_handle_error(nanos_err); + } + } + } + } + } + { + _Bool mcc_is_in_final; + nanos_err_t mcc_err_in_final = nanos_in_final(&mcc_is_in_final); + if (mcc_err_in_final != NANOS_OK) + { + nanos_handle_error(mcc_err_in_final); + } + if (mcc_is_in_final) + { + { + printf("@%d I cover your backs as well!\n", id); + } + } + else + { + { + nanos_wd_dyn_props_t nanos_wd_dyn_props; + struct nanos_args_1_t *ol_args; + nanos_err_t nanos_err; + struct nanos_args_1_t imm_args; + nanos_data_access_t dependences[1L]; + static nanos_smp_args_t smp_ol_main_1_args = {.outline = (void (*)(void *))(void (*)(struct nanos_args_1_t *))&smp_ol_main_1}; + static struct nanos_const_wd_definition_1 nanos_wd_const_data = {.base = {.props = {.mandatory_creation = 0, .tied = 1, .clear_chunk = 0, .reserved0 = 0, .reserved1 = 0, .reserved2 = 0, .reserved3 = 0, .reserved4 = 0}, .data_alignment = __alignof__(struct nanos_args_1_t), .num_copies = 0, .num_devices = 1, .num_dimensions = 0, .description = "main"}, .devices = {[0] = {.factory = &nanos_smp_factory, .arg = &smp_ol_main_1_args}}}; + nanos_wd_dyn_props.tie_to = 0; + nanos_wd_dyn_props.priority = 0; + nanos_wd_dyn_props.flags.is_final = 0; + nanos_wd_dyn_props.flags.is_implicit = 0; + ol_args = (struct nanos_args_1_t *)0; + void *nanos_wd_ = (void *)0; + nanos_err = nanos_create_wd_compact(&nanos_wd_, &nanos_wd_const_data.base, &nanos_wd_dyn_props, sizeof(struct nanos_args_1_t), (void **)&ol_args, nanos_current_wd(), (nanos_copy_data_t **)0, (nanos_region_dimension_internal_t **)0); + if (nanos_err != NANOS_OK) + { + nanos_handle_error(nanos_err); + } + if (nanos_wd_ != (void *)0) + { + (*ol_args).id = id; + nanos_err = nanos_submit(nanos_wd_, 0, &dependences[0], (void *)0); + if (nanos_err != NANOS_OK) + { + nanos_handle_error(nanos_err); + } + } + else + { + imm_args.id = id; + nanos_err = nanos_create_wd_and_run_compact(&nanos_wd_const_data.base, &nanos_wd_dyn_props, sizeof(struct nanos_args_1_t), &imm_args, 0, &dependences[0], (nanos_copy_data_t *)0, (nanos_region_dimension_internal_t *)0, (void (*)(void *, void *))0); + if (nanos_err != NANOS_OK) + { + nanos_handle_error(nanos_err); + } + } + } + } + } + } + } + } + { + nanos_err_t nanos_err; + nanos_err = nanos_omp_barrier(); + if (nanos_err != NANOS_OK) + { + nanos_handle_error(nanos_err); + } + } + { + int nanos_chunk; + nanos_ws_info_loop_t nanos_setup_info_loop; + nanos_err_t nanos_err; + nanos_ws_desc_t *wsd_1; + _Bool single_guard; + struct nanos_args_2_t imm_args; + void *current_ws_policy = nanos_omp_find_worksharing(nanos_omp_sched_static); + if (current_ws_policy == 0) + { + nanos_handle_error(NANOS_UNIMPLEMENTED); + } + nanos_chunk = 1; + nanos_setup_info_loop.lower_bound = 0; + nanos_setup_info_loop.upper_bound = 2; + nanos_setup_info_loop.loop_step = 1; + nanos_setup_info_loop.chunk_size = nanos_chunk; + nanos_err = nanos_worksharing_create(&wsd_1, current_ws_policy, (void **)&nanos_setup_info_loop, &single_guard); + if (nanos_err != NANOS_OK) + { + nanos_handle_error(nanos_err); + } + if (single_guard) + { + int sup_threads; + nanos_err = nanos_team_get_num_supporting_threads(&sup_threads); + if (nanos_err != NANOS_OK) + { + nanos_handle_error(nanos_err); + } + if (sup_threads > 0) + { + nanos_wd_dyn_props_t dyn_props; + nanos_err = nanos_malloc((void **)&(*wsd_1).threads, sizeof(void *) * sup_threads, "", 0); + if (nanos_err != NANOS_OK) + { + nanos_handle_error(nanos_err); + } + nanos_err = nanos_team_get_supporting_threads(&(*wsd_1).nths, (*wsd_1).threads); + if (nanos_err != NANOS_OK) + { + nanos_handle_error(nanos_err); + } + struct nanos_args_2_t *ol_args = (struct nanos_args_2_t *)0; + static nanos_smp_args_t smp_ol_main_2_args = {.outline = (void (*)(void *))(void (*)(struct nanos_args_2_t *))&smp_ol_main_2}; + static struct nanos_const_wd_definition_1 nanos_wd_const_data = {.base = {.props = {.mandatory_creation = 1, .tied = 1, .clear_chunk = 0, .reserved0 = 0, .reserved1 = 0, .reserved2 = 0, .reserved3 = 0, .reserved4 = 0}, .data_alignment = __alignof__(struct nanos_args_2_t), .num_copies = 0, .num_devices = 1, .num_dimensions = 0, .description = "main"}, .devices = {[0] = {.factory = &nanos_smp_factory, .arg = &smp_ol_main_2_args}}}; + void *nanos_wd_ = (void *)0; + dyn_props.tie_to = (void *)0; + dyn_props.priority = 0; + dyn_props.flags.is_final = 0; + dyn_props.flags.is_implicit = 0; + static void *replicate = (void *)0; + if (replicate == (void *)0) + { + replicate = nanos_find_slicer("replicate"); + } + if (replicate == (void *)0) + { + nanos_handle_error(NANOS_UNIMPLEMENTED); + } + nanos_err = nanos_create_sliced_wd(&nanos_wd_, nanos_wd_const_data.base.num_devices, nanos_wd_const_data.devices, (unsigned long int)sizeof(struct nanos_args_2_t), nanos_wd_const_data.base.data_alignment, (void **)&ol_args, (void **)0, replicate, &nanos_wd_const_data.base.props, &dyn_props, 0, (nanos_copy_data_t **)0, 0, (nanos_region_dimension_internal_t **)0); + if (nanos_err != NANOS_OK) + { + nanos_handle_error(nanos_err); + } + (*ol_args).wsd_1 = wsd_1; + (*ol_args).id = &id; + nanos_err = nanos_submit(nanos_wd_, 0, (nanos_data_access_t *)0, (void *)0); + if (nanos_err != NANOS_OK) + { + nanos_handle_error(nanos_err); + } + nanos_err = nanos_free((*wsd_1).threads); + if (nanos_err != NANOS_OK) + { + nanos_handle_error(nanos_err); + } + } + } + imm_args.wsd_1 = wsd_1; + imm_args.id = &id; + smp_ol_main_2(&(imm_args)); + } + { + nanos_err_t nanos_err; + nanos_err = nanos_omp_barrier(); + if (nanos_err != NANOS_OK) + { + nanos_handle_error(nanos_err); + } + } + if (nanos_omp_get_thread_num() == 0) + { + { + printf("@%d Now I attack the inner core...\n", id); + printf("@%d ... and destroy it !\n", id); + } + } + { + nanos_err_t nanos_err; + nanos_err = nanos_omp_barrier(); + if (nanos_err != NANOS_OK) + { + nanos_handle_error(nanos_err); + } + } + printf("@%d We\'re done!!!\n", id); + } + nanos_err = nanos_omp_barrier(); + if (nanos_err != NANOS_OK) + { + nanos_handle_error(nanos_err); + } + nanos_err = nanos_leave_team(); + if (nanos_err != NANOS_OK) + { + nanos_handle_error(nanos_err); + } + } +} +static void smp_ol_main_3(struct nanos_args_3_t *const args) +{ + { + smp_ol_main_3_unpacked(); + } +} diff --git a/openmp_testing/__binaries__/benchmark b/openmp_testing/__binaries__/benchmark new file mode 100755 index 0000000000000000000000000000000000000000..a4c12a55c2bb10c9e53e6c90614d4876d140ab10 GIT binary patch literal 15440 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 RdQjy8(g4LE`=CrP1px08d%^$! literal 0 HcmV?d00001 diff --git a/openmp_testing/__binaries__/parallel-demo b/openmp_testing/__binaries__/parallel-demo new file mode 100755 index 0000000000000000000000000000000000000000..a476143a5c5cc1963a4bc2ecbdf1218b819fe2a8 GIT binary patch literal 11600 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 literal 0 HcmV?d00001 diff --git a/openmp_testing/__init__.py b/openmp_testing/__init__.py new file mode 100644 index 0000000..718e328 --- /dev/null +++ b/openmp_testing/__init__.py @@ -0,0 +1,4 @@ +LD_PRELOAD = "/home/kevin/travail/Python/mcgdb/openmp/capture/preload/__binaries__/libmcgdb_omp.preload.so" + +from . import sequence, stepping + diff --git a/openmp_testing/benchmark.c b/openmp_testing/benchmark.c new file mode 100644 index 0000000..395625f --- /dev/null +++ b/openmp_testing/benchmark.c @@ -0,0 +1,168 @@ +#include <omp.h> +#include <stdio.h> +#include <stdlib.h> +#include <sys/time.h> +#include <unistd.h> + +void do_something(int it); + +/***********/ +// modified by debugging, do not change to macro. +int repeat = 2; + +int it_count = 50; +int us_sleep_time = 0; + +int it_total = 0; +volatile int something; +void (*what_to_do)(int it) = NULL; +/***********/ + +void finish_data_ready(void) {} + +void finish(struct timeval x, struct timeval y) { + + //static float it_total; + static float ms_busy_time, us_busy_once; + static float ms_total_sleep; + static float ms_time; + { + static double x_us, y_us; + + x_us = (double) x.tv_sec*1000000 + (double) x.tv_usec; + y_us = (double) y.tv_sec*1000000 + (double) y.tv_usec; + + //it_total = repeat * it_count; + + ms_time = (y_us - x_us)/1000; + ms_total_sleep = us_sleep_time*(it_total/1000.0); + ms_busy_time = ms_time - ms_total_sleep; + us_busy_once = ms_busy_time * 1000 / it_total; + } + + finish_data_ready(); + + printf("Repeat: %d; Loop: %d; usleep %dus (one) %1.fms (total)\n", + repeat, it_count, us_sleep_time, ms_total_sleep); + printf("------------------\n"); + printf("Total time: %1.fms\n", ms_time); + printf("Busy time : %1.fms\n", ms_busy_time); + printf("Busy once : %1.fus\n", us_busy_once); +} + +void do_something(int it) { + something = it; +#pragma omp atomic + it_total++; + if (us_sleep_time) + usleep(us_sleep_time); +} + +void do_nothing(int it) { + something = it; +} + +void do_single(int it) { + #pragma omp single + { + do_nothing(it); + } +} + +void do_critical(int it) { + #pragma omp critical + { + do_nothing(it); + } +} + +void do_sections(int it) { + #pragma omp sections + { + #pragma omp section + { + do_nothing(it); + } + #pragma omp section + { + do_nothing(it+1); + } + #pragma omp section + { + do_nothing(it+2); + } + } +} + +void do_barrier(int it) { + #pragma omp barrier + do_nothing(it); +} + +void do_master(int it) { + #pragma omp master + { + do_nothing(it); + } +} + +void do_single_task(int it) { + #pragma omp single + { + #pragma omp task + { + //printf("Task going %d/%d.\n", it, it_count); + do_something(it); + } + } +} + +void benchmark(void (*action)(int)) { + #pragma omp parallel + { + int i; + for (i = 0; i < it_count; ++i) { + do_something(i); + action(i); + } + } +} + +void run_once(void (*what_to_do)(int)) { + struct timeval before , after; + int i; + + benchmark(what_to_do); // warm-up + printf("Warmup done.\n"); + + it_total = 0; + gettimeofday(&before , NULL); + + for (i = 0; i < repeat; ++i) { + benchmark(what_to_do); + } + + gettimeofday(&after , NULL); + + finish(before, after); + + return; +} + + +int main(int argc, char** argv) { + if (what_to_do == NULL) { + void (*WHAT_TO_RUN[])(int) = {do_critical, do_master, do_sections, do_barrier, do_single}; + char *NAMES[] = {"Critical", "Master", "Sections", "Barrier", "Single"}; + + int NB_RUNS = sizeof(WHAT_TO_RUN)/sizeof(WHAT_TO_RUN[0]); + + for (int i = 0; i < NB_RUNS; i++) { + printf("\n\n---- <%s> ----\n", NAMES[i]); + run_once(WHAT_TO_RUN[i]); + printf("---- </%s> ----\n", NAMES[i]); + } + } else { + run_once(what_to_do); + } +} diff --git a/openmp_testing/benchmark.py b/openmp_testing/benchmark.py new file mode 100644 index 0000000..730e069 --- /dev/null +++ b/openmp_testing/benchmark.py @@ -0,0 +1,36 @@ +from gdb_tester import * +from . import LD_PRELOAD +gdb = None + +def prepare_and_run(what): + gdb.set_title(what.replace("do_", "").replace("_", " ")) + gdb.execute('set env LD_PRELOAD={}'.format(LD_PRELOAD)) + gdb.execute("set env OMP_NUM_THREADS=2") + gdb.execute_many(["autodetect_models", "start"]) + + gdb.execute("set what_to_do = {}".format(what)) + gdb.execute("break finish_data_ready") + gdb.execute("continue") + gdb.execute("up") + + gdb.save_value("us_busy_once", "%1.f", "us") + +WHAT_TO_RUN = [ + "do_critical", + "do_master", + "do_sections", + "do_barrier", + "do_single", + "do_single_task" + ] + +def benchmark(_gdb): + global gdb + gdb = _gdb + + gdb.start(CSource("benchmark.c")) + for what in WHAT_TO_RUN: + gdb.reset(hard=True) + prepare_and_run(what) + + gdb.quit() diff --git a/openmp_testing/count.py b/openmp_testing/count.py new file mode 100644 index 0000000..8c23810 --- /dev/null +++ b/openmp_testing/count.py @@ -0,0 +1,37 @@ +from gdb_tester import * +from . import LD_PRELOAD + +gdb = None + +def prepare_and_run(what): + gdb.set_title(what.replace("do_", "")) + + gdb.execute('set env LD_PRELOAD={}'.format(LD_PRELOAD)) + + gdb.execute_many(["autodetect_models", "start"]) + + gdb.execute("set what_to_do = {}".format(what)) + gdb.execute("set repeat = 0") + gdb.execute("set it_count = 1") + + gdb.execute("break finish_data_ready") + gdb.execute("continue") + gdb.execute("python import mcgdb") + + gdb.save_py_value("str(mcgdb.capture.FunctionBreakpoint.hit_count) + '+' + str( mcgdb.capture.FunctionFinishBreakpoint.hit_count)") + + +def benchmark(_gdb): + global gdb + gdb = _gdb + + from . import benchmark + + gdb.start(CSource("benchmark.c")) + for what in benchmark.WHAT_TO_RUN: + gdb.reset(hard=True) + prepare_and_run(what) + + gdb.quit() + + raise FinishException() diff --git a/openmp_testing/no_instrumentation.py b/openmp_testing/no_instrumentation.py new file mode 100644 index 0000000..720821f --- /dev/null +++ b/openmp_testing/no_instrumentation.py @@ -0,0 +1,31 @@ +from gdb_tester import * +from . import LD_PRELOAD +gdb = None + +def prepare_and_run(what): + gdb.set_title(what.replace("do_", "")) + gdb.execute('set env LD_PRELOAD={}'.format(LD_PRELOAD)) + + gdb.execute("start") + + gdb.execute("set what_to_do = {}".format(what)) + + gdb.execute("break finish_data_ready") + gdb.execute("continue") + gdb.execute("up") + gdb.execute("python import mcgdb") + + gdb.save_value("us_busy_once", "%1.f", "us") + +def benchmark(_gdb): + global gdb + gdb = _gdb + + from . import benchmark + + gdb.start(CSource("benchmark.c")) + for what in benchmark.WHAT_TO_RUN: + gdb.reset(hard=True) + prepare_and_run(what) + + gdb.quit() diff --git a/openmp_testing/opm_seq_print.expected b/openmp_testing/opm_seq_print.expected new file mode 100644 index 0000000..e683b52 --- /dev/null +++ b/openmp_testing/opm_seq_print.expected @@ -0,0 +1,7 @@ +{ + 1; 2; 3; 4; + + 1 -> 1 [leftnote="main"] + 1 -> 1 [here, label="<dead>"]; + 1 <- 1 [narrow] +} \ No newline at end of file diff --git a/openmp_testing/opm_seq_print_all.expected b/openmp_testing/opm_seq_print_all.expected new file mode 100644 index 0000000..890ec82 --- /dev/null +++ b/openmp_testing/opm_seq_print_all.expected @@ -0,0 +1,67 @@ +{ + 1; 2; 3; 4; + + 1 -> 1 [leftnote="main"]; + parallel { + 1; 3; 4; 2; + + single { + 1; 3; 4; 2; + + 4 -> 4 [label="enter"]; + 4 <- 4 [label="exit"]; + === <Barrier 1> === + }; + critical { + 1; 3; 4; 2; + + 3 -> 3 [label="enter"]; + 3 -> 2; + 2 -> 4; + 4 -> 1; + 1 <- 1 [label="finish"] + }; + single { + 1; 3; 4; 2; + + 3 -> 3 [label="enter"]; + 3 -> 3 [msg, label="Task 1"]; + 3 -> 3 [msg, label="Task 2"]; + 3 <- 3 [label="exit"]; + === <Barrier 2> === + task { + 2; + + 2 -> 2 [label="Task 1"]; + 2 <- 2 + } + task { + 1; + + 1 -> 1 [label="Task 2"]; + 1 <- 1 + } + === </Barrier 2> === + }; + section { + 1; 3; 4; 2; + + 1 -> 1 [label="Section #1"]; + 4 -> 4 [label="Section #3"]; + 2 -> 2 [label="Section #2"]; + 4 <- 4; + 2 <- 2; + 1 <- 1 + }; + === <Barrier 3> ===; + task master { + 1; + + 1 -> 1 [label="Task 3"]; + 1 <- 1 + }; + === <Barrier 4> === + } + 1 -> 1 [here, label="<dead>"]; + 1 <- 1 [narrow] +} \ No newline at end of file diff --git a/openmp_testing/parallel-demo.c b/openmp_testing/parallel-demo.c new file mode 100644 index 0000000..6f3a8a0 --- /dev/null +++ b/openmp_testing/parallel-demo.c @@ -0,0 +1,69 @@ +#include <omp.h> +#include <stdio.h> + +int main() { + printf("@Base: Let's attack the death start !\n"); + printf("@Base: Releash all the starfighters.\n"); +#pragma omp parallel + { + int id = omp_get_thread_num() + 1; + + printf("@%d On the way to the combat zone.\n", id); +#pragma omp single + { + printf("@%d I opened a breach in the star,\n", id); + printf("@%d but we can only enter one by one.\n", id); + } + +#pragma omp critical + { + printf("@%d I'm entering the breach\n", id); + } + + /****/ + + printf("\n@%d Someone needs to cover us!\n", id); + +#pragma omp single + { + printf("@%d I give the orders\n", id); + +#pragma omp task + { + printf("@%d I cover your backs!\n", id); + } +#pragma omp task + { + printf("@%d I cover your backs as well!\n", id); + } + } + +#pragma omp sections + { +#pragma omp section + { + printf("@%d I attack the energy field!\n", id); + } +#pragma omp section + { + printf("@%d I attack the generator!\n", id); + } +#pragma omp section + { + printf("@%d I follow the rabits!\n", id); + } + } + +#pragma omp barrier + +#pragma omp master + { + printf("@%d Now I attack the inner core...\n", id); + printf("@%d ... and destroy it !\n", id); + } +#pragma omp barrier + + printf("@%d We're done!!!\n", id); + } + printf("@Base: Everybody's back to safety, great job!\n"); +} diff --git a/openmp_testing/sequence.py b/openmp_testing/sequence.py new file mode 100644 index 0000000..7317efd --- /dev/null +++ b/openmp_testing/sequence.py @@ -0,0 +1,16 @@ +from gdb_tester import * + +expected_start = """Enable model GCC OpenMP""" +expected_print = expected_file("opm_seq_print.expected") +expected_print_all = expected_file("opm_seq_print_all.expected") + +def test(gdb): + print("Running :)") + + gdb.start(CSource("parallel-demo.c")) + gdb.execute_many(["autodetect_models", "run"]) + + gdb.execute("opm sequence --print", expected_print, may_fail=True) + gdb.execute("opm sequence --print --all", expected_print_all, may_fail=True) + + gdb.quit() diff --git a/openmp_testing/stepping.py b/openmp_testing/stepping.py new file mode 100644 index 0000000..6c4332b --- /dev/null +++ b/openmp_testing/stepping.py @@ -0,0 +1,18 @@ +from gdb_tester import * + +from . import LD_PRELOAD + +def test(gdb): + gdb.start(CSource("parallel-demo.c")) + gdb.execute('set env LD_PRELOAD={}'.format(LD_PRELOAD)) + + gdb.execute_many(["autodetect_models", "start"]) + gdb.execute("opm start", "OpenMP parallel zone started") + gdb.execute("opm step", "in single zone") + gdb.execute("opm all_out", "Out of the single zone") + gdb.execute("opm step", "in critical zone") + gdb.execute("opm critical next", "in critical zone") + gdb.execute("opm critical next", "in critical zone") + gdb.execute("opm step out", "outside Critical zone") + + gdb.quit() -- GitLab