From bc213b6b24b5b37f091d7732d4a80ef609203193 Mon Sep 17 00:00:00 2001 From: Matt Wala Date: Fri, 28 Jun 2019 13:49:10 -0500 Subject: [PATCH 1/2] Fix uninitialized accesses to reduction variables in *_imany reductions. Closes #3 --- vec_wrappers.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/vec_wrappers.py b/vec_wrappers.py index 7dce1d6..f152419 100644 --- a/vec_wrappers.py +++ b/vec_wrappers.py @@ -309,6 +309,17 @@ def get_vector_wrapper(func_name, args, out_args, vec_func_name=None, else: yield " %s, intent(%s) :: %s" % (type_, intent, name) + # Make sure output reduction variables have been initialized at least once - + # it is not guaranteed that the called routines will write to all entries of + # the variable. + if has_indirect_many: + for type_, name, shape in args: + if (has_indirect_many and + name in out_args and + MANY_MARKER not in shape): + tmp = name + "_tmp" + yield " %s = 0" % tmp + extra_omp = "" if has_indirect: extra_omp = " schedule(dynamic, %d)" % omp_chunk_size @@ -608,6 +619,8 @@ def gen_vector_wrappers(): ! ------------------ code ier = 0 + ier_tmp = 0 + expn_tmp = 0 !$omp parallel do default(none) schedule(dynamic, 10) & !$omp private(tgt_icenter, center, rscale, itgt_box, & -- GitLab From eb8ed8516e6adf70fd900fad09de301f05e2ab3b Mon Sep 17 00:00:00 2001 From: Matt Wala Date: Fri, 28 Jun 2019 14:02:40 -0500 Subject: [PATCH 2/2] Change reduction variables to firstprivate --- vec_wrappers.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/vec_wrappers.py b/vec_wrappers.py index f152419..4f1d8cf 100644 --- a/vec_wrappers.py +++ b/vec_wrappers.py @@ -328,11 +328,13 @@ def get_vector_wrapper(func_name, args, out_args, vec_func_name=None, if has_indirect_many: private_vars = ["icsr", "ncsr_count"] + firstprivate_vars = [] for type_, name, shape in args: if shape and name in out_args and MANY_MARKER not in shape: - private_vars.append(name + "_tmp") + firstprivate_vars.append(name + "_tmp") extra_omp += " private(%s)" % ", ".join(private_vars) + extra_omp += " firstprivate(%s)" % ", ".join(firstprivate_vars) shared_vars = ["nvcount"] for type_, name, shape in args: @@ -625,7 +627,8 @@ def gen_vector_wrappers(): !$omp parallel do default(none) schedule(dynamic, 10) & !$omp private(tgt_icenter, center, rscale, itgt_box, & !$omp isrc_box_start, isrc_box_stop, src_ibox, & - !$omp isrc_start, expn_tmp, ier_tmp) & + !$omp isrc_start) & + !$omp firstprivate(expn_tmp, ier_tmp) & !$omp shared(ier, ${eqn.in_arg_list()|cpost} & !$omp nsources, sources, & %if dp_or_no: -- GitLab