结构在数组中时组件的行为
Behavior of components when structures are in an array
我目前正在使用 Fortran90 模拟一个大约有 5000 万个粒子的物理系统。每个都有一个位置x(为了简化)。
现在,我使用包含每个粒子位置的一维向量。当我必须对每个粒子进行迭代时,我只需遍历该向量(因为我注意对粒子进行排序以限制缓存未命中)。
我现在正在考虑创建一个 粒子 class。但是在我迭代时如何访问它的位置呢?它会像以前的案例一样快吗?
那么,编译器如何存储对象的属性呢?更何况,具有多个属性的情况呢?
感谢您的宝贵时间。
关于“如何存储派生类型”:
Fortran 标准要求 序列类型 的组件按照组件的声明顺序存储(在内存中)作为连续存储序列。序列类型是那些用 SEQUENCE
语句声明的类型,这意味着该类型应至少有一个组件,每个组件应为固有或序列类型,不应为参数化或可扩展类型,并且不能有类型绑定的过程。如果您想要这种行为并且您的类型合适,请将其设为序列类型(您可以考虑 data alignment)。
另一方面,Fortran 标准没有说明编译器必须如何为非序列派生类型 组织存储。这一点也不坏,因为编译器可以自由地优化存储。大多数时候,您可能期望与序列类型几乎相同:只要可能(填充可能适用)连续存储的东西。数组和字符串总是连续的。指针和可分配组件是唯一的参考,原因很明显,它们的目标位于其他地方。
来自标准:
A structure resolves into a sequence of components. Unless the
structure includes a SEQUENCE statement, the use of this terminology
in no way implies that these components are stored in this, or any
other, order. Nor is there any requirement that contiguous storage be
used. The sequence merely refers to the fact that in writing the
definitions there will necessarily be an order in which the components
appear, and this will define a sequence of components. This order is
of limited significance because a component of an object of derived
type will always be accessed by a component name except in the
following contexts: the sequence of expressions in a derived-type
value constructor, intrinsic assignment, the data values in namelist
input data, and the inclusion of the structure in an input/output list
of a formatted data transfer, where it is expanded to this sequence of
components. Provided the processor adheres to the defined order in
these cases, it is otherwise free to organize the storage of the
components for any nonsequence structure in memory as best suited to
the particular architecture.
关于“派生类型是否比独立数组更快”:
正如@VladmirF 在评论中所说,这是一个广泛的话题,在很大程度上取决于您如何访问和操作您的数据,并且之前已经被询问和回答过(查看其评论中的链接)。您可能会在附近找到很多关于它的信息("cache blocking" 上的 link1, link2) and I'll add this one 您可能会感兴趣。
我目前正在使用 Fortran90 模拟一个大约有 5000 万个粒子的物理系统。每个都有一个位置x(为了简化)。
现在,我使用包含每个粒子位置的一维向量。当我必须对每个粒子进行迭代时,我只需遍历该向量(因为我注意对粒子进行排序以限制缓存未命中)。
我现在正在考虑创建一个 粒子 class。但是在我迭代时如何访问它的位置呢?它会像以前的案例一样快吗?
那么,编译器如何存储对象的属性呢?更何况,具有多个属性的情况呢?
感谢您的宝贵时间。
关于“如何存储派生类型”:
Fortran 标准要求 序列类型 的组件按照组件的声明顺序存储(在内存中)作为连续存储序列。序列类型是那些用 SEQUENCE
语句声明的类型,这意味着该类型应至少有一个组件,每个组件应为固有或序列类型,不应为参数化或可扩展类型,并且不能有类型绑定的过程。如果您想要这种行为并且您的类型合适,请将其设为序列类型(您可以考虑 data alignment)。
另一方面,Fortran 标准没有说明编译器必须如何为非序列派生类型 组织存储。这一点也不坏,因为编译器可以自由地优化存储。大多数时候,您可能期望与序列类型几乎相同:只要可能(填充可能适用)连续存储的东西。数组和字符串总是连续的。指针和可分配组件是唯一的参考,原因很明显,它们的目标位于其他地方。
来自标准:
A structure resolves into a sequence of components. Unless the structure includes a SEQUENCE statement, the use of this terminology in no way implies that these components are stored in this, or any other, order. Nor is there any requirement that contiguous storage be used. The sequence merely refers to the fact that in writing the definitions there will necessarily be an order in which the components appear, and this will define a sequence of components. This order is of limited significance because a component of an object of derived type will always be accessed by a component name except in the following contexts: the sequence of expressions in a derived-type value constructor, intrinsic assignment, the data values in namelist input data, and the inclusion of the structure in an input/output list of a formatted data transfer, where it is expanded to this sequence of components. Provided the processor adheres to the defined order in these cases, it is otherwise free to organize the storage of the components for any nonsequence structure in memory as best suited to the particular architecture.
关于“派生类型是否比独立数组更快”:
正如@VladmirF 在评论中所说,这是一个广泛的话题,在很大程度上取决于您如何访问和操作您的数据,并且之前已经被询问和回答过(查看其评论中的链接)。您可能会在附近找到很多关于它的信息("cache blocking" 上的 link1, link2) and I'll add this one 您可能会感兴趣。