我正在使用 Fortran 编写有关 CFD 主题的代码。在与一些计算机科学领域的朋友讨论后,他们告诉我,如果在他/她的代码中实现数组结构(SoA)而不是结构数组(AoS),可以加快计算时间。
我见过很多关于这个主题的实现的例子,但大多数都是用 C 或 C++ 编写的。 (例如。https://software.intel.com/en-us/articles/how-to-manipulate-data-struct-to-optimize-memory-use-on-32-bit-intel-architecture https://software.intel.com/en-us/articles/how-to-manipulate-data-structure-to-optimize-memory-use-on-32-bit-intel-architecture).
有人可以向我展示或指导我一些如何在 Fortran 中实现 SoA 而不是 AoS 的基本想法或示例吗?
这个概念确实没有什么困难。
代替
type struct
real x, y, z
end type
type(struct), allocatable :: array(:)
you use
type(struct2)
real, dimension(:), allocatable :: x, y, z
end ype
type(struct2) :: arrays
它实际上只是 C 或 C++ 示例的逐行翻译。或多或少,您可以读到的有关本主题的所有内容仍然适用于 Fortran,即使他们使用其他语言作为示例。
实际上,在过去,Fortran 没有任何结构,最自然的方式就是声明变量:
real x(bigN)
real y(bigN)
real z(bigN)
您也可以通过这种方式获得数组结构的所有性能优势。对于 Fortranner 来说,有人只知道结构数组,这听起来很奇怪。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)