void OpenMPTransform::parallel_for_preorder(OpenMP::ParallelForConstruct parallel_for_construct) { ObjectList<OpenMP::ReductionSymbol> inner_reductions; inner_reductions_stack.push(inner_reductions); // Increase the parallel nesting value parallel_nesting++; common_parallel_data_sharing_code(parallel_for_construct); Statement construct_body = parallel_for_construct.body(); // The construct is in fact a ForStatement in a #pragma omp parallel for ForStatement for_statement(construct_body); // The induction variable deserves special treatment Symbol induction_var = for_statement.get_induction_variable().get_symbol(); induction_var_stack.push(induction_var); // Set it private if it was not if ((parallel_for_construct.get_data_attribute(induction_var) & OpenMP::DA_PRIVATE) != OpenMP::DA_PRIVATE) { ObjectList<Symbol>& private_references = parallel_for_construct.get_data<ObjectList<Symbol> >("private_references"); // Set private parallel_for_construct.add_data_attribute(induction_var, OpenMP::DA_PRIVATE); // And insert into private references as well private_references.insert(induction_var); ObjectList<Symbol>& shared_references = parallel_for_construct.get_data<ObjectList<Symbol> >("shared_references"); // Remove from shared references if it appears there shared_references = shared_references.not_find(induction_var); } }
void OpenMPTransform::parallel_for_preorder(PragmaCustomConstruct parallel_for_construct) { ObjectList<OpenMP::ReductionSymbol> inner_reductions; inner_reductions_stack.push(inner_reductions); // Increase the parallel nesting value parallel_nesting++; common_parallel_data_sharing_code(parallel_for_construct); }
void OpenMPTransform::parallel_single_preorder(OpenMP::ParallelSingleConstruct parallel_single_construct) { // Allocate a new element for inner reductions ObjectList<OpenMP::ReductionSymbol> inner_reductions; inner_reductions_stack.push(inner_reductions); // Increase the parallel nesting value parallel_nesting++; common_parallel_data_sharing_code(parallel_single_construct); }