OMPRegion

An OpenMP region: a directive, its clauses and the code it applies to.

Declaration

Syntax

OMPRegion(omp_region_type region, omp_clause* clauses, stmt* body)

Arguments

Argument

Description

region

which directive this is; see omp_region_type.

clauses

the clauses of the directive; see omp_clause.

body

the statements the directive applies to.

Return values

None.

Description

One node represents every OpenMP construct. region says which directive it is, clauses carries what was written after it, and body is the structured block it applies to. Regions nest exactly as the directives do, so !$omp parallel containing !$omp do is an OMPRegion of type Parallel whose body holds an OMPRegion of type Do.

A directive that applies to no block, such as barrier or taskwait, is an OMPRegion with an empty body.

Examples

An ASR text document that uses it:

(TranslationUnit
  :symtab (SymbolTable
    :id 0
    :symbols {
      "main" (Program
        :symtab (SymbolTable
          :id 1
          :symbols {
            "a" (Variable
              :parent_symtab 1
              :name "a"
              :dependencies []
              :intent :Local
              :symbolic_value nil
              :value nil
              :storage :Default
              :type (Array
                :type (Integer
                  :kind 4
                )
                :dims [
                  (dimension
                    :start (IntegerConstant
                      :n 1
                      :type (Integer
                        :kind 4
                      )
                      :intboz_type :Decimal
                    )
                    :length (IntegerConstant
                      :n 3
                      :type (Integer
                        :kind 4
                      )
                      :intboz_type :Decimal
                    )
                  )
                ]
                :physical_type :FixedSizeArray
              )
              :type_declaration nil
              :abi :Source
              :access :Public
              :presence :Required
              :value_attr false
              :target_attr false
              :contiguous_attr false
              :bindc_name nil
              :is_volatile false
              :is_protected false
              :pass_attr :NotMethod
              :self_argument nil
              :codims []
            )
            "i" (Variable
              :parent_symtab 1
              :name "i"
              :dependencies []
              :intent :Local
              :symbolic_value nil
              :value nil
              :storage :Default
              :type (Integer
                :kind 4
              )
              :type_declaration nil
              :abi :Source
              :access :Public
              :presence :Required
              :value_attr false
              :target_attr false
              :contiguous_attr false
              :bindc_name nil
              :is_volatile false
              :is_protected false
              :pass_attr :NotMethod
              :self_argument nil
              :codims []
            )
            "n" (Variable
              :parent_symtab 1
              :name "n"
              :dependencies []
              :intent :Local
              :symbolic_value nil
              :value nil
              :storage :Default
              :type (Integer
                :kind 4
              )
              :type_declaration nil
              :abi :Source
              :access :Public
              :presence :Required
              :value_attr false
              :target_attr false
              :contiguous_attr false
              :bindc_name nil
              :is_volatile false
              :is_protected false
              :pass_attr :NotMethod
              :self_argument nil
              :codims []
            )
            "run" (Variable
              :parent_symtab 1
              :name "run"
              :dependencies []
              :intent :Local
              :symbolic_value nil
              :value nil
              :storage :Default
              :type (Logical
                :kind 4
              )
              :type_declaration nil
              :abi :Source
              :access :Public
              :presence :Required
              :value_attr false
              :target_attr false
              :contiguous_attr false
              :bindc_name nil
              :is_volatile false
              :is_protected false
              :pass_attr :NotMethod
              :self_argument nil
              :codims []
            )
            "total" (Variable
              :parent_symtab 1
              :name "total"
              :dependencies []
              :intent :Local
              :symbolic_value nil
              :value nil
              :storage :Default
              :type (Integer
                :kind 4
              )
              :type_declaration nil
              :abi :Source
              :access :Public
              :presence :Required
              :value_attr false
              :target_attr false
              :contiguous_attr false
              :bindc_name nil
              :is_volatile false
              :is_protected false
              :pass_attr :NotMethod
              :self_argument nil
              :codims []
            )
          }
        )
        :name "main"
        :dependencies []
        :body [
          (OMPRegion
            :region :Parallel
            :clauses [
              (OMPPrivate
                :vars [
                  (Var
                    :v (SymbolRef 1 "i")
                  )
                ]
              )
              (OMPShared
                :vars [
                  (Var
                    :v (SymbolRef 1 "a")
                  )
                ]
              )
              (OMPFirstPrivate
                :vars [
                  (Var
                    :v (SymbolRef 1 "n")
                  )
                ]
              )
              (OMPNumThreads
                :num_threads (IntegerConstant
                  :n 4
                  :type (Integer
                    :kind 4
                  )
                  :intboz_type :Decimal
                )
              )
              (OMPIf
                :condition (Var
                  :v (SymbolRef 1 "run")
                )
              )
            ]
            :body [
              (OMPRegion
                :region :Do
                :clauses [
                  (OMPSchedule
                    :kind :Static
                    :chunk_size (IntegerConstant
                      :n 1
                      :type (Integer
                        :kind 4
                      )
                      :intboz_type :Decimal
                    )
                  )
                  (OMPCollapse
                    :count (IntegerConstant
                      :n 1
                      :type (Integer
                        :kind 4
                      )
                      :intboz_type :Decimal
                    )
                  )
                  (OMPReduction
                    :operator :ReduceAdd
                    :vars [
                      (Var
                        :v (SymbolRef 1 "total")
                      )
                    ]
                  )
                  (OMPLastPrivate
                    :vars [
                      (Var
                        :v (SymbolRef 1 "i")
                      )
                    ]
                  )
                  (OMPNowait)
                ]
                :body [
                  (DoLoop
                    :name nil
                    :head (do_loop_head
                      :v (Var
                        :v (SymbolRef 1 "i")
                      )
                      :start (IntegerConstant
                        :n 1
                        :type (Integer
                          :kind 4
                        )
                        :intboz_type :Decimal
                      )
                      :end (IntegerConstant
                        :n 3
                        :type (Integer
                          :kind 4
                        )
                        :intboz_type :Decimal
                      )
                      :increment (IntegerConstant
                        :n 1
                        :type (Integer
                          :kind 4
                        )
                        :intboz_type :Decimal
                      )
                    )
                    :body [
                      (Assignment
                        :target (Var
                          :v (SymbolRef 1 "total")
                        )
                        :value (IntegerBinOp
                          :left (Var
                            :v (SymbolRef 1 "total")
                          )
                          :op :Add
                          :right (Var
                            :v (SymbolRef 1 "i")
                          )
                          :type (Integer
                            :kind 4
                          )
                          :value nil
                        )
                        :overloaded nil
                        :realloc_lhs false
                        :move_allocation false
                      )
                    ]
                    :orelse []
                  )
                ]
              )
            ]
          )
          (OMPRegion
            :region :Target
            :clauses [
              (OMPMap
                :type :ToFrom
                :vars [
                  (Var
                    :v (SymbolRef 1 "a")
                  )
                ]
              )
              (OMPDevice
                :device (IntegerConstant
                  :n 0
                  :type (Integer
                    :kind 4
                  )
                  :intboz_type :Decimal
                )
              )
            ]
            :body [
              (OMPRegion
                :region :Teams
                :clauses [
                  (OMPNumTeams
                    :num_teams (IntegerConstant
                      :n 2
                      :type (Integer
                        :kind 4
                      )
                      :intboz_type :Decimal
                    )
                  )
                  (OMPThreadLimit
                    :thread_limit (IntegerConstant
                      :n 64
                      :type (Integer
                        :kind 4
                      )
                      :intboz_type :Decimal
                    )
                  )
                ]
                :body [
                  (Assignment
                    :target (Var
                      :v (SymbolRef 1 "total")
                    )
                    :value (IntegerConstant
                      :n 0
                      :type (Integer
                        :kind 4
                      )
                      :intboz_type :Decimal
                    )
                    :overloaded nil
                    :realloc_lhs false
                    :move_allocation false
                  )
                ]
              )
            ]
          )
        ]
      )
    }
  )
  :items []
)

See Also

omp_region_type, omp_clause, DoConcurrentLoop