Fortran 可分配的内部存储器表示
Internal memory representation of Fortran allocatable
我想知道 Fortran 可分配数组的内部内存表示是什么。
我理解这比原始指针复杂一点,因为形状和等级也必须存储。
我也猜想这取决于实现,因为我在 Fortran 2003 standard 中找不到信息。
但是,我想知道使用哪种结构来表示可分配数组(即使只针对一个编译器)。
我知道这个问题有点宽泛,但如有任何帮助,我们将不胜感激。
可分配数组、指针数组以及假定的形状数组参数都使用数组描述符(也称为掺杂向量)处理。
任何编译器都可以拥有自己的数组描述符结构。它可以在编译器手册中找到。但是描述符有一个标准化格式,用于与 C 通信(以及可能与 C 通信的 Fortran 之外的其他软件)。
这个标准描述符可能不会被编译器内部使用,但它可以。如果它也在内部使用,那么编译器在调用 C-interoperable 过程时不必准备新的描述符。例如gfortran计划支持标准描述符"preferably as native format".
Intel 在 https://software.intel.com/en-us/node/678452.
中描述了一个与 C-interoperable 不同的本机数组描述符示例
C-interoperable 数组参数的数组描述符结构由 技术规范 ISO/IEC TS 29113:2012 关于 Fortran 与 C[= 的进一步互操作性定义41=],将成为 Fortran 2015 的一部分。
在 C header 文件中 ISO_Fortran_binding.h
定义了一个用 Fortran 描述符(假设形状、指针或可分配)定义的 C 结构。
它看起来如下(来自 IBM website,某些细节可能是特定于编译器的):
CFI_cdesc_t
A type definition that describes a C descriptor. It contains the following structure members:
void *base_addr
The base address of the data object that is described. For deallocated allocatable objects, base_addr is NULL.
size_t elem_len
For scalars: The size in bytes of the data object that is described.
For arrays: The size in bytes of one element of the array.
int version
The version number of the C descriptor. Currently, the only valid value is available by using the CFI_VERSION macro.
CFI_attribute_t attribute
The attribute code of the C descriptor. For the valid values for attribute, see Table 1.
CFI_type_t type
The type code of the C descriptor. Describes the type of the object that is described by the C descriptor. For the valid values for type, see Table 2.
CFI_rank_t rank
The rank of the object that is described by the C descriptor. Its value must be in the range 0 ≤ rank ≤ CFI_MAX_RANK. A value of 0 indicates that the object is a scalar. Otherwise, the object is an array.
CFI_dim_t dim[]
An array of size rank that describes the lower bound, extent, and stride of each dimension.
There is a reserved area between rank and dim. The size of the reserved area is 12 words in 32-bit mode and 9 words in 64-bit mode.
引用的 CFI_
类型也在 ISO_Fortran_binding.h
header 中定义。
因此,even-though 这个描述符可能与您的编译器内部使用的描述符不完全相同,这是一个很好的例子,说明人们应该在 Fortran 数组中期望什么样的数据组件描述符.
但是,请注意,gfortran 这种非常常见的编译器还没有使用这种类型的描述符。只有一个 experimental version with the new descriptor and the current descriptor is described in the manual. The status is also mentioned at Further Interoperability of Fortran with C.
我想知道 Fortran 可分配数组的内部内存表示是什么。
我理解这比原始指针复杂一点,因为形状和等级也必须存储。
我也猜想这取决于实现,因为我在 Fortran 2003 standard 中找不到信息。
但是,我想知道使用哪种结构来表示可分配数组(即使只针对一个编译器)。
我知道这个问题有点宽泛,但如有任何帮助,我们将不胜感激。
可分配数组、指针数组以及假定的形状数组参数都使用数组描述符(也称为掺杂向量)处理。
任何编译器都可以拥有自己的数组描述符结构。它可以在编译器手册中找到。但是描述符有一个标准化格式,用于与 C 通信(以及可能与 C 通信的 Fortran 之外的其他软件)。
这个标准描述符可能不会被编译器内部使用,但它可以。如果它也在内部使用,那么编译器在调用 C-interoperable 过程时不必准备新的描述符。例如gfortran计划支持标准描述符"preferably as native format".
Intel 在 https://software.intel.com/en-us/node/678452.
中描述了一个与 C-interoperable 不同的本机数组描述符示例C-interoperable 数组参数的数组描述符结构由 技术规范 ISO/IEC TS 29113:2012 关于 Fortran 与 C[= 的进一步互操作性定义41=],将成为 Fortran 2015 的一部分。
在 C header 文件中 ISO_Fortran_binding.h
定义了一个用 Fortran 描述符(假设形状、指针或可分配)定义的 C 结构。
它看起来如下(来自 IBM website,某些细节可能是特定于编译器的):
CFI_cdesc_t
A type definition that describes a C descriptor. It contains the following structure members:
void *base_addr
The base address of the data object that is described. For deallocated allocatable objects, base_addr is NULL.
size_t elem_len
For scalars: The size in bytes of the data object that is described.
For arrays: The size in bytes of one element of the array.
int version
The version number of the C descriptor. Currently, the only valid value is available by using the CFI_VERSION macro.
CFI_attribute_t attribute
The attribute code of the C descriptor. For the valid values for attribute, see Table 1.
CFI_type_t type
The type code of the C descriptor. Describes the type of the object that is described by the C descriptor. For the valid values for type, see Table 2.
CFI_rank_t rank
The rank of the object that is described by the C descriptor. Its value must be in the range 0 ≤ rank ≤ CFI_MAX_RANK. A value of 0 indicates that the object is a scalar. Otherwise, the object is an array.
CFI_dim_t dim[]
An array of size rank that describes the lower bound, extent, and stride of each dimension.
There is a reserved area between rank and dim. The size of the reserved area is 12 words in 32-bit mode and 9 words in 64-bit mode.
引用的 CFI_
类型也在 ISO_Fortran_binding.h
header 中定义。
因此,even-though 这个描述符可能与您的编译器内部使用的描述符不完全相同,这是一个很好的例子,说明人们应该在 Fortran 数组中期望什么样的数据组件描述符.
但是,请注意,gfortran 这种非常常见的编译器还没有使用这种类型的描述符。只有一个 experimental version with the new descriptor and the current descriptor is described in the manual. The status is also mentioned at Further Interoperability of Fortran with C.