Exemplo n.º 1
0
        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);
        }
Exemplo n.º 3
0
        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);
        }