From e157f026790105af3750da020b16d014546ce70f Mon Sep 17 00:00:00 2001 From: Xinyao Yi Date: Mon, 4 Nov 2019 19:37:22 -0500 Subject: [PATCH 1/3] Fixed issue #68 Now the normalization of depend clause is finished --- src/OpenMPIR.cpp | 63 ++++++++++++++++++++++++++++++++++++------------ src/OpenMPIR.h | 1 + src/ompparser.yy | 2 +- tests/task.txt | 12 +++++++++ 4 files changed, 62 insertions(+), 16 deletions(-) diff --git a/src/OpenMPIR.cpp b/src/OpenMPIR.cpp index 04e7f13..e89acfd 100644 --- a/src/OpenMPIR.cpp +++ b/src/OpenMPIR.cpp @@ -3708,10 +3708,9 @@ OpenMPClause* OpenMPLinearClause::addLinearClause(OpenMPDirective *directive, Op current_clauses->push_back(new_clause); (*all_clauses)[OMPC_linear] = current_clauses; } - else { - //std::cerr << "Cannot have two bind clause for the directive " << directive->getKind() << ", ignored\n"; + else { new_clause = new OpenMPLinearClause(modifier); - current_clauses->push_back(new_clause); + current_clauses->push_back(new_clause); }; (*all_clauses)[OMPC_linear] = current_clauses; return new_clause; @@ -3723,8 +3722,6 @@ void OpenMPLinearClause::mergeLinear(OpenMPDirective *directive, OpenMPClause* c std::vector* current_clauses = directive->getClauses(OMPC_linear); OpenMPClause* new_clause = NULL; - current_clauses = directive->getClauses(OMPC_linear); - for (std::vector::iterator it = current_clauses->begin(); it != current_clauses->end()-1; it++) { if (((OpenMPLinearClause*)(*it))->getModifier() == ((OpenMPLinearClause*)current_clause)->getModifier() && ((OpenMPLinearClause*)(*it))->getUserDefinedStep() == ((OpenMPLinearClause*)current_clause)->getUserDefinedStep()) { @@ -3861,7 +3858,6 @@ OpenMPClause* OpenMPAffinityClause::addAffinityClause(OpenMPDirective *directive return new_clause; } -//OpenMPClause* OpenMPDependClause::addDependClause(OpenMPDirective *directive, OpenMPDependClauseModifier modifier, OpenMPDependClauseType type, std::vector* > depend_iterators_definition_class) { OpenMPClause* OpenMPDependClause::addDependClause(OpenMPDirective *directive, OpenMPDependClauseModifier modifier, OpenMPDependClauseType type) { std::map* >* all_clauses = directive->getAllClauses(); @@ -3875,21 +3871,58 @@ OpenMPClause* OpenMPDependClause::addDependClause(OpenMPDirective *directive, Op current_clauses->push_back(new_clause); (*all_clauses)[OMPC_depend] = current_clauses; } else { - for(std::vector::iterator it = current_clauses->begin(); it != current_clauses->end(); ++it) { - if (((OpenMPDependClause*)(*it))->getModifier() == modifier && - ((OpenMPDependClause*)(*it))->getType() == type) { - new_clause = (*it); - return new_clause; - } - } - /* could fine the matching object for this clause */ - //new_clause = new OpenMPDependClause(modifier, type, depend_iterators_definition_class); new_clause = new OpenMPDependClause(modifier, type); current_clauses->push_back(new_clause); } + (*all_clauses)[OMPC_depend] = current_clauses; return new_clause; } +void OpenMPDependClause::mergeDepend(OpenMPDirective *directive, OpenMPClause* current_clause) { + std::map* >* all_clauses = directive->getAllClauses(); + std::vector* current_clauses = directive->getClauses(OMPC_depend); + OpenMPClause* new_clause = NULL; + + if (current_clauses->size() == 1) return; + + for (std::vector::iterator it = current_clauses->begin(); it != current_clauses->end()-1; it++) { + if (((OpenMPDependClause*)(*it))->getModifier() == ((OpenMPDependClause*)current_clause)->getModifier() && ((OpenMPDependClause*)(*it))->getType() == ((OpenMPDependClause*)current_clause)->getType()) { + bool normalize = true; + std::vector* >* depend_iterators_definition_previous = ((OpenMPDependClause*)(*it))->getDependIteratorsDefinitionClass(); + std::vector* >* depend_iterators_definition_current = ((OpenMPDependClause*)current_clause)->getDependIteratorsDefinitionClass(); + if(depend_iterators_definition_previous->size() == depend_iterators_definition_current->size()){ + for (std::vector* >::iterator it_expr_current_outer = depend_iterators_definition_current->begin(); it_expr_current_outer != depend_iterators_definition_current->end(); it_expr_current_outer++) { + for (std::vector* >::iterator it_expr_previous_outer = depend_iterators_definition_previous->begin(); it_expr_previous_outer != depend_iterators_definition_previous->end(); it_expr_previous_outer++) { + bool merge = 0; + if (strcmp((*it_expr_current_outer)->at(0), (*it_expr_previous_outer)->at(0)) == 0 && strcmp((*it_expr_current_outer)->at(1), (*it_expr_previous_outer)->at(1)) == 0 && strcmp((*it_expr_current_outer)->at(2), (*it_expr_previous_outer)->at(2)) == 0 && strcmp((*it_expr_current_outer)->at(3), (*it_expr_previous_outer)->at(3)) == 0 && strcmp((*it_expr_current_outer)->at(4), (*it_expr_previous_outer)->at(4)) == 0){ + bool merge = 1; + break; + } + if(it_expr_previous_outer == depend_iterators_definition_previous->end()-1 && merge == 0) { + normalize = false; + } + } + if(normalize == false) break; + } + if (normalize == true) { + std::vector* expressions_previous = ((OpenMPDependClause*)(*it))->getExpressions(); + std::vector* expressions_current = current_clause->getExpressions(); + for (std::vector::iterator it_expr_current = expressions_current->begin(); it_expr_current != expressions_current->end(); it_expr_current++) { + bool para_merge = 1; + for (std::vector::iterator it_expr_previous = expressions_previous->begin(); it_expr_previous != expressions_previous->end(); it_expr_previous++) { + if(strcmp(*it_expr_current, *it_expr_previous) == 0 ){ + para_merge = 0; + } + } + if(para_merge == 1) expressions_previous->push_back(*it_expr_current); + } + current_clauses->pop_back(); + break; + } + } + } + } +} OpenMPClause* OpenMPDepobjUpdateClause::addDepobjUpdateClause(OpenMPDirective *directive, OpenMPDepobjUpdateClauseDependeceType type) { std::map* >* all_clauses = directive->getAllClauses(); diff --git a/src/OpenMPIR.h b/src/OpenMPIR.h index cc61bbe..22df195 100644 --- a/src/OpenMPIR.h +++ b/src/OpenMPIR.h @@ -730,6 +730,7 @@ class OpenMPDependClause : public OpenMPClause { static OpenMPClause * addDependClause(OpenMPDirective *, OpenMPDependClauseModifier, OpenMPDependClauseType); std::string toString(); void generateDOT(std::ofstream&, int, int, std::string); + void mergeDepend(OpenMPDirective*, OpenMPClause*); }; diff --git a/src/ompparser.yy b/src/ompparser.yy index 3b70f42..674064d 100644 --- a/src/ompparser.yy +++ b/src/ompparser.yy @@ -922,7 +922,7 @@ depend_with_modifier_clause : DEPEND { firstParameter = OMPC_DEPEND_MODIFIER_uns ; depend_parameter : dependence_type ':' var_list - | depend_modifier ',' dependence_type ':' var_list + | depend_modifier ',' dependence_type ':' var_list { ((OpenMPDependClause*)current_clause)->mergeDepend(current_directive, current_clause); } ; dependence_type : depend_enum_type { ((OpenMPDependClause*)current_clause)->setDependIteratorsDefinitionClass(depend_iterators_definition_class); } ; diff --git a/tests/task.txt b/tests/task.txt index c0c4486..21f0cfb 100644 --- a/tests/task.txt +++ b/tests/task.txt @@ -14,3 +14,15 @@ PASS: #pragma omp task affinity (iterator ( int bba=4:120:2, double b=1:220:3, i #pragma omp task affinity(iterator(int bba=4:120:2, b=1:220:3, int c=2:57:9):b, c) in_reduction (test_identifier : x11, y, z) untied mergeable priority(5) detach(abc) depend(iterator(int bba=4:120:2, b=1:220:3, int c=2:57:9),in:m, n) private (a[foo(x, goo(x, y)):100], b[1:30], c) firstprivate (foo(x), y) shared (a, b, c[1:10]) PASS: #pragma omp task private (a[foo(x,goo(x,y)):100], b[1:30], c) firstprivate (foo(x), y) shared (a, b, c[1:10]) untied mergeable in_reduction (test_identifier : x11, y, z) depend (iterator ( int bba=4:120:2, b=1:220:3, int c=2:57:9 ), in : m, n) priority (5) affinity (iterator ( int bba=4:120:2, b=1:220:3, int c=2:57:9 ) : b, c) detach (abc) + +#pragma omp task depend(iterator(int bba=4:120:2, b=1:220:3, int c=2:57:9),in:m, n) depend(iterator(int bba=4:120:2, b=1:220:3, int c=2:57:9),in:m, n, o, p) +PASS: #pragma omp task depend (iterator ( int bba=4:120:2, b=1:220:3, int c=2:57:9 ), in : m, n, o, p) + +#pragma omp task depend(iterator(int bba=4:120:2, b=1:220:3, int c=2:57:9),in:m, n) depend(iterator(int bba=4:120:2),in:m, n) +PASS: #pragma omp task depend (iterator ( int bba=4:120:2, b=1:220:3, int c=2:57:9 ), in : m, n) depend (iterator ( int bba=4:120:2 ), in : m, n) + +#pragma omp task depend(iterator(int bba=4:120:2, b=1:220:3, int c=2:57:9),in:m, n) depend(iterator(int bba=4:120:2, b=1:220:3, int c=2:57:9),inout:m, n) +PASS: #pragma omp task depend (iterator ( int bba=4:120:2, b=1:220:3, int c=2:57:9 ), in : m, n) depend (iterator ( int bba=4:120:2, b=1:220:3, int c=2:57:9 ), inout : m, n) + +#pragma omp task depend(iterator(int bba=4:120:2, b=1:220:3, int c=2:57:9),inout:m, n) depend(iterator(int bba=4:120:2, b=1:220:3, int c=2:57:9),inout:m, n, o, p) +PASS: #pragma omp task depend (iterator ( int bba=4:120:2, b=1:220:3, int c=2:57:9 ), inout : m, n, o, p) From 3ed0e6dfff52e74f1d79843bfbbf54d4966606f8 Mon Sep 17 00:00:00 2001 From: Xinyao Yi Date: Wed, 6 Nov 2019 23:04:22 -0500 Subject: [PATCH 2/3] Fixed some formatting errors --- src/OpenMPIR.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/OpenMPIR.cpp b/src/OpenMPIR.cpp index e89acfd..01e89b8 100644 --- a/src/OpenMPIR.cpp +++ b/src/OpenMPIR.cpp @@ -3883,26 +3883,26 @@ void OpenMPDependClause::mergeDepend(OpenMPDirective *directive, OpenMPClause* c std::vector* current_clauses = directive->getClauses(OMPC_depend); OpenMPClause* new_clause = NULL; - if (current_clauses->size() == 1) return; + if (current_clauses->size() == true) return; for (std::vector::iterator it = current_clauses->begin(); it != current_clauses->end()-1; it++) { if (((OpenMPDependClause*)(*it))->getModifier() == ((OpenMPDependClause*)current_clause)->getModifier() && ((OpenMPDependClause*)(*it))->getType() == ((OpenMPDependClause*)current_clause)->getType()) { bool normalize = true; std::vector* >* depend_iterators_definition_previous = ((OpenMPDependClause*)(*it))->getDependIteratorsDefinitionClass(); std::vector* >* depend_iterators_definition_current = ((OpenMPDependClause*)current_clause)->getDependIteratorsDefinitionClass(); - if(depend_iterators_definition_previous->size() == depend_iterators_definition_current->size()){ + if (depend_iterators_definition_previous->size() == depend_iterators_definition_current->size()){ for (std::vector* >::iterator it_expr_current_outer = depend_iterators_definition_current->begin(); it_expr_current_outer != depend_iterators_definition_current->end(); it_expr_current_outer++) { for (std::vector* >::iterator it_expr_previous_outer = depend_iterators_definition_previous->begin(); it_expr_previous_outer != depend_iterators_definition_previous->end(); it_expr_previous_outer++) { - bool merge = 0; + bool merge = false; if (strcmp((*it_expr_current_outer)->at(0), (*it_expr_previous_outer)->at(0)) == 0 && strcmp((*it_expr_current_outer)->at(1), (*it_expr_previous_outer)->at(1)) == 0 && strcmp((*it_expr_current_outer)->at(2), (*it_expr_previous_outer)->at(2)) == 0 && strcmp((*it_expr_current_outer)->at(3), (*it_expr_previous_outer)->at(3)) == 0 && strcmp((*it_expr_current_outer)->at(4), (*it_expr_previous_outer)->at(4)) == 0){ - bool merge = 1; + bool merge = true; break; } - if(it_expr_previous_outer == depend_iterators_definition_previous->end()-1 && merge == 0) { + if (it_expr_previous_outer == depend_iterators_definition_previous->end()-1 && merge == 0) { normalize = false; } } - if(normalize == false) break; + if (normalize == false) break; } if (normalize == true) { std::vector* expressions_previous = ((OpenMPDependClause*)(*it))->getExpressions(); @@ -3910,11 +3910,11 @@ void OpenMPDependClause::mergeDepend(OpenMPDirective *directive, OpenMPClause* c for (std::vector::iterator it_expr_current = expressions_current->begin(); it_expr_current != expressions_current->end(); it_expr_current++) { bool para_merge = 1; for (std::vector::iterator it_expr_previous = expressions_previous->begin(); it_expr_previous != expressions_previous->end(); it_expr_previous++) { - if(strcmp(*it_expr_current, *it_expr_previous) == 0 ){ - para_merge = 0; + if (strcmp(*it_expr_current, *it_expr_previous) == 0 ){ + para_merge = false; } } - if(para_merge == 1) expressions_previous->push_back(*it_expr_current); + if (para_merge == 1) expressions_previous->push_back(*it_expr_current); } current_clauses->pop_back(); break; From fd10667e5046c2648dc1bf2237dc7e6c285cf4b5 Mon Sep 17 00:00:00 2001 From: Xinyao Yi Date: Wed, 6 Nov 2019 23:09:46 -0500 Subject: [PATCH 3/3] Fixed some formatting errors. --- src/OpenMPIR.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenMPIR.cpp b/src/OpenMPIR.cpp index 01e89b8..89115b1 100644 --- a/src/OpenMPIR.cpp +++ b/src/OpenMPIR.cpp @@ -3898,7 +3898,7 @@ void OpenMPDependClause::mergeDepend(OpenMPDirective *directive, OpenMPClause* c bool merge = true; break; } - if (it_expr_previous_outer == depend_iterators_definition_previous->end()-1 && merge == 0) { + if (it_expr_previous_outer == depend_iterators_definition_previous->end()-1 && merge == false) { normalize = false; } } @@ -3908,13 +3908,13 @@ void OpenMPDependClause::mergeDepend(OpenMPDirective *directive, OpenMPClause* c std::vector* expressions_previous = ((OpenMPDependClause*)(*it))->getExpressions(); std::vector* expressions_current = current_clause->getExpressions(); for (std::vector::iterator it_expr_current = expressions_current->begin(); it_expr_current != expressions_current->end(); it_expr_current++) { - bool para_merge = 1; + bool para_merge = true; for (std::vector::iterator it_expr_previous = expressions_previous->begin(); it_expr_previous != expressions_previous->end(); it_expr_previous++) { if (strcmp(*it_expr_current, *it_expr_previous) == 0 ){ para_merge = false; } } - if (para_merge == 1) expressions_previous->push_back(*it_expr_current); + if (para_merge == true) expressions_previous->push_back(*it_expr_current); } current_clauses->pop_back(); break;