Array¶
An array type.
声明¶
语法¶
Array(ttype type, dimension* dims, array_physical_type physical_type,
memory_space memory_space)
参数¶
Argument |
描述 |
|---|---|
|
the element type. It is never itself an array: a rank two array is one Array with two dimensions. |
|
one dimension per rank, giving the lower bound and the extent. Both may be |
|
how the array is represented; see array_physical_type. |
|
which memory the storage lives in; see memory_space. |
返回值¶
None. A type is not evaluated.
描述¶
The shape is part of the type, so a procedure’s dummy argument and the actual
argument passed to it may have the same element type and rank but different
physical_type, and the frontend inserts an
ArrayPhysicalCast between them.
The physical type has to agree with the dimensions, and the verifier checks that it does:
a
FixedSizeArrayis stored inline, so every lower bound and every extent is a compile-time constant (asr.verify.array.fixed_size_constant_dims). The deferred constants of a template are exempt until it is instantiated;an allocatable or pointer array is a
DescriptorArray(asr.verify.allocatable.array_descriptor,asr.verify.pointer.array_descriptor);an assumed-size dummy argument,
a(n, *), is passed as its data alone and has no extent in its last dimension, so it is never aDescriptorArrayunless it is polymorphic and the descriptor carries its dynamic type (asr.verify.variable.assumed_size_descriptor). It is anUnboundedPointerArray, or aPointerArrayforbind(c). A rank onea(*)has the same dimensions as the assumed-shapea(:), so only the physical type tells the two apart.
An assumed-rank array has no dimensions at all: its dims is empty and its
physical type is AssumedRankArray. Its rank is only known at the call, and
SelectRank is what recovers it.
memory_space says which memory the elements live in. Everything on the host
is Global, and so is a buffer a kernel is given; the other spaces appear
only inside GPU code, where a variable may instead be private to a thread or
shared by a threadgroup. See memory_space.
示例¶
(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
:memory_space :Global
)
It comes from this complete ASR text document:
(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
:memory_space :Global
)
: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 []
:common_block nil
)
"b" (Variable
:parent_symtab 1
:name "b"
: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
:memory_space :Global
)
: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 []
:common_block nil
)
"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 []
:common_block nil
)
"l" (Variable
:parent_symtab 1
:name "l"
: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 []
:common_block nil
)
}
)
:name "main"
:dependencies []
:body [
(Assignment
:target (Var
:v (SymbolRef 1 "a")
)
:value (ArrayConstant
:n_data 12
:data #asr/bytes "010000000200000003000000"
: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
:memory_space :Global
)
:storage_format :ColMajor
)
:overloaded nil
:realloc_lhs false
:move_allocation false
:new_target false
:new_allocation false
)
(Assignment
:target (Var
:v (SymbolRef 1 "i")
)
:value (ArrayItem
:v (Var
:v (SymbolRef 1 "a")
)
:args [
(array_index
:left nil
:right (IntegerConstant
:n 2
:type (Integer
:kind 4
)
:intboz_type :Decimal
)
:step nil
)
]
:type (Integer
:kind 4
)
:storage_format :ColMajor
:value nil
:in_bounds false
)
:overloaded nil
:realloc_lhs false
:move_allocation false
:new_target false
:new_allocation false
)
(Assignment
:target (Var
:v (SymbolRef 1 "b")
)
:value (ArraySection
:v (Var
:v (SymbolRef 1 "a")
)
:args [
(array_index
:left (IntegerConstant
:n 1
:type (Integer
:kind 4
)
:intboz_type :Decimal
)
:right (IntegerConstant
:n 3
:type (Integer
:kind 4
)
:intboz_type :Decimal
)
:step (IntegerConstant
:n 1
:type (Integer
:kind 4
)
:intboz_type :Decimal
)
)
]
: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 :DescriptorArray
:memory_space :Global
)
:value nil
)
:overloaded nil
:realloc_lhs false
:move_allocation false
:new_target false
:new_allocation false
)
(Assignment
:target (Var
:v (SymbolRef 1 "i")
)
:value (ArraySize
:v (Var
:v (SymbolRef 1 "a")
)
:dim (IntegerConstant
:n 1
:type (Integer
:kind 4
)
:intboz_type :Decimal
)
:type (Integer
:kind 4
)
:value nil
)
:overloaded nil
:realloc_lhs false
:move_allocation false
:new_target false
:new_allocation false
)
(Assignment
:target (Var
:v (SymbolRef 1 "i")
)
:value (ArrayRank
:v (Var
:v (SymbolRef 1 "a")
)
:type (Integer
:kind 4
)
:value nil
)
:overloaded nil
:realloc_lhs false
:move_allocation false
:new_target false
:new_allocation false
)
(Assignment
:target (Var
:v (SymbolRef 1 "i")
)
:value (ArrayBound
:v (Var
:v (SymbolRef 1 "a")
)
:dim (IntegerConstant
:n 1
:type (Integer
:kind 4
)
:intboz_type :Decimal
)
:type (Integer
:kind 4
)
:bound :UBound
:value nil
)
:overloaded nil
:realloc_lhs false
:move_allocation false
:new_target false
:new_allocation false
)
(Assignment
:target (Var
:v (SymbolRef 1 "l")
)
:value (ArrayIsContiguous
:array (Var
:v (SymbolRef 1 "a")
)
:type (Logical
:kind 4
)
:value nil
)
:overloaded nil
:realloc_lhs false
:move_allocation false
:new_target false
:new_allocation false
)
]
:global_init nil
)
}
)
:items []
:global_init nil
)
也可以看看¶
dimension, array_physical_type, memory_space, ArrayItem, ArrayPhysicalCast, ArrayConstant