如何在 Fortran 中实现数组结构而不是结构数组?

2024-06-25

我正在使用 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(使用前将#替换为@)

如何在 Fortran 中实现数组结构而不是结构数组? 的相关文章

  • 指定 gfortran 应该在其中查找模块的目录

    我目前基于模块来编译程序 例如主程序foo这取决于模块bar 如下 gfortran c bar f90 gfortran o foo exe foo f90 bar o 当foo f90 and bar f90位于同一目录中 如何指定 g
  • 将数组从 .npy 文件读入 Fortran 90

    我使用 Python 以二维数组 例如 X 的形式生成一些初始数据 然后使用 Fortran 对它们进行一些计算 最初 当数组大小约为 10 000 x 10 000 时 np savetxt 在速度方面表现良好 但是一旦我开始增加数组的维
  • 尝试读取名单后返回的状态不是预期的

    我想从文件中读取名单 但在名单不存在的情况下实现捕获选项 从我读到的here http msg ucsf edu local programs IBM Compilers Fortran html pgs lr76 htm我期望状态为 84
  • 使用 MacLaurin 展开的 Fortran Sine 函数的微小差异

    我正在用 Fortran 创建一个程序 它接受以弧度表示的 sin x 的 x 然后是要计算的项数 这是我的程序 Sine value using MacLaurin series program SineApprox implicit n
  • Fortran gfortran linux 中的“分段错误(核心转储)”错误

    我正在创建一个程序 该程序将分析目录中的文件 fits 然后它将在另一个目录中创建另一个文件 txt 它只是一个转换器 当我尝试执行该程序 编译正常 时 它给了我一条错误消息 程序收到信号 SIGSEGV 分段错误 无效的内存引用 此错误的
  • 使用 Fortran 进行数组问题的二分查找

    我正在使用 Schaum 的 Fortran 77 编程概要 一书 其中有一个关于使用括号值组方法进行二分搜索的示例 首先这是代码 INTEGER X 100 INTEGER RANGE INTEGER START FINISH PRINT
  • MPI_Type_Create_Hindexed_Block 生成派生数据类型的错误范围

    使用Fortran 我尝试为动态分配的结构构建派生数据类型 但它得到了新类型的错误范围 代码如下 PROGRAM MAIN IMPLICIT NONE INCLUDE mpif h INTEGER I INTEGER MYID NUMPRO
  • Fortran 递归分段错误

    我必须设计并实现一个 Fortran 例程来确定方格上簇的大小 并且递归地编写子例程似乎非常方便 然而 每当我的晶格大小超过某个值 大约 200 边 时 子例程就会始终出现段错误 这是我的集群检测例程 RECURSIVE SUBROUTIN
  • Fortran 意图(inout)与省略意图

    良好的实践表明 Fortran 中的子例程参数每个都应具有指定的意图 即intent in intent out or intent inout 如上所述这个问题 https stackoverflow com questions 1011
  • 在 fortran 子例程中包含 c/c++ 头文件

    我有一个用 C C 编写的库 其开发人员声明该库具有 Fortran 接口 该接口将被启用 包括头文件 h 并调用经典子例程 我想编译我的 Fortran 程序并链接该库 该库已经过测试并且可以工作 这是主程序 Main program I
  • 带有过程参数的通用类型绑定过程

    我正在尝试编写一个通用的类型绑定过程 它将不同的回调函数作为参数 当编译以下代码 使用 ifort 12 1 3 时 我收到以下警告 module test type a type contains procedure t s gt at
  • Fortran 正在读取超出结束文件记录的内容

    我正在尝试从文件中读取一些数据 而结束文件记录检测对于停止读取非常重要 但是 根据用于读取数据的数组的数组维度 我无法正确检测结束文件记录 并且我的 Fortran 程序停止 程序如下 integer dimension 3 x line
  • FORTRAN:数据多态

    我试图隐藏真实数据类型和复杂数据类型之间的差异 在 FORTRAN 2003 中 我认为可能有一种方法可以做到这一点 目标是定义一个多态可分配数组 其类型可以在运行时决定 另外 还有一个子例程 它使用多态数组来做一些代数 相同的方程适用于真
  • 带有数字/标签的 Fortran IF 语句而不是另一个语句

    这段 Fortran 代码的含义是什么 IF J1 3 20 20 21 21 J1 J1 3 20 IF J2 3 22 22 23 23 J2 J2 3 22 CONTINUE 我在旧项目中看到过 我不知道这个带有数字 标签 的 IF
  • 派生类型数组:选择条目

    目前在我的代码中我有一个二维数组 integer allocatable elements 并定义一些常量 integer parameter TYP 1 integer parameter WIDTH 2 integer paramete
  • CMake:Fortran 模块和编译顺序

    我有一个大型 Fortran 程序 其中包含许多目录 每个目录都在伪库中单独编译 但仍然存在相互依赖的混乱 因此最终所有伪库都组合在一个可用的库中 我想使用 Fortran 模块 但它非常脆弱 因为我不能依赖自动依赖项检查 并且根据顺序编译
  • Fortran 子例程返回错误值

    嘿 我正在开发一个 Fortran 程序 遇到了一个奇怪的问题 当我尝试在调用特定子例程之前直接输出数组的某些值时 我得到了正确的值 然后 我尝试在启动子例程时输出同一数组的一些值 它们都是 0 我最终在子例程之后输出数组的值 并且这些值回
  • 当输入字符而不是数字时,防止 FORTRAN 关闭

    我有一个读取语句需要一个数字 非常简单的示例代码 program test integer var read var end 问题是我通常输入一串字符 即 yes 因为分心 如何防止我的代码完全停止并显示以下类型的错误消息您输入了错误的值
  • 错误:(1) 处的分配中的等级 0 和 1 不兼容

    我正在不规则网格上使用有限差分方法 这是代码的重要部分 IMPLICIT DOUBLE PRECISION A Z REAL 16 IPSI ICORR POT 20000 VA 20000 delta1 20000 delta2 2000
  • Fortran + Openmp 比顺序更慢

    我有这个 Fortran 语言的顺序代码 我的问题是 当我放置 Openmp 指令时 并行代码比顺序代码更慢 并且我没有看到错误 REAL DIMENSION ALLOCATABLE current next ALLOCATE curren

随机推荐

  • Mac 上的 FFMPEG 和 PHP 不起作用

    我需要你的帮助 目前我使用 Mac OS X 10 9 4 和 xampp apache 1 8 3 3 我需要使用ffmpeg 版本3 2 通过php转换视频文件exec 但我无法让它发挥作用 我做了一些运行终端命令行的测试 系统运行正常
  • ASP.NET MVC 3 中未经身份验证用户的缓存主页

    我的网站有一个主页 我想为匿名用户缓存该页面 并将其设置为经过身份验证的用户的 私有 以便他们将其保存在自己的计算机上 而不是其他地方 因此 如果用户是匿名的 我想将页面保存在服务器缓存中 并使用以下命令保存在浏览器缓存中Cache con
  • 无需打开即可打印 PDF

    我想要构建的是 通过单击按钮 我想触发 PDF 文件的打印 但不打开它 Print PDF Click gt printPdf pdfUrl 我第一次尝试的方法是使用 iframe var iframe null This is suppo
  • 如何使用 BoW 正确训练 OpenCV SVM

    我无法训练 SVM 识别我的对象 我正在尝试使用 SURF Bag Of Words SVM 来做到这一点 我的问题是分类器没有检测到任何东西 所有结果都是0 这是我的代码 Ptr
  • 完美批量转发参数

    我有一个小的 python 脚本 args py import sys print sys argv 我怎样才能写一个 bat将所有参数转发给该脚本的包装文件 为了从测试中消除我的 shell 我将调用它 import subprocess
  • Tensorflow ValueError:形状 (?, 1) 和 (?,) 不兼容

    当我用 3 个 lstm 层运行代码时 我遇到了这个错误 不知道如何修复它 任何人都可以帮忙 这里 MAX SEQUENCE LENGTH 250 运行成本函数后 我收到错误 ValueError 形状 1 和 不兼容 Generate a
  • 让 ISSkin 与最新的 Inno Setup Unicode 配合使用

    我是第一次尝试ISSkin http isskin codejock com 使用 Inno 设置 我想尝试一下黑色风格 所以我尝试了他们的示例 Setup AppName ISSkin Example AppVersion 1 0 0 2
  • 如何在 Windows 窗体应用程序中跟踪 C# 中两次按钮单击之间的时间?

    我已经用 C 创建了一个 Windows 窗体应用程序 其中接受用户的输入 我想计算用户在两次提交之间花费的时间 我该怎么做 Use 跑表 http msdn microsoft com en us library system diagn
  • 在 WebAPI OData 请求中包含相关实体

    有没有办法在 OData 请求中包含相关实体 例如 我有一个 Person 实体和一个 Task 实体 这种关系是一对多的 一个人有很多任务 如果我使用 OData 请求查询数据 odata Person 要获取所有 Person 实体 返
  • Mac OS X 10.7 Lion 上的 AVFoundation 核心动画问题

    在 Mac OS X 10 7 中 Apple 引入了 AVFoundation 我正在尝试生成一个包含动画形状的简单快速电影 问题是核心动画没有渲染 我最终只有一个空白的 黑色 视频 下面是我使用的代码 我尝试了很多变体 但遗憾的是它们都
  • primefaces 面包屑无法与 ui:repeat 一起使用

    我无法渲染面包屑对素面的控制 我正在使用 ui repeat 动态构建面包屑 当我把它包进里面的那一刻p 面包屑标签 我看不到页面上的控件 以下代码是我在 xhtml 中使用的
  • 将 Sage Line 50 与 Windows 应用程序集成

    我必须将 C Windows 应用程序与 Sage Line 50 集成 将所有发票详细信息从应用程序发送到 Sage 我在 Google 上搜索 大多数地方都说要集成 Sage Line 50 我们需要使用 Sage 开发套件 SDK 但
  • 使用 Chrome 扩展 chrome.storage.local 实现无限存储?

    The docs https developer chrome com docs extensions reference storage property local对于 Chrome 扩展chrome storage local sta
  • 在 Common Test 测试运行期间,Lager 调用失败

    我决定在我的 Erlang 项目中设置 lager 我正在使用 erlang mk 所以我添加了 ERLC OPTS parse transform lager transform 到我的 Makefile 我可以跑make all并编译模
  • 如何从 iPhone 应用程序中的 URL 读取 .rtf 文件

    我的应用程序需要从 URL 读取 rtf 文件 我将把它读为 NSURL url NSURL URLWithString NSString stringWithFormat rtf URL NSError error NSString co
  • Heroku dyno/worker 在开始时崩溃

    我有一个用 Rails 编写的应用程序 部署在 Heroku 上 我以前一直在开发1个web dyno 但是今天我发布了应用程序 流量相当大 所以我决定增加到4个web dyno和1个worker dyno 我不知道为什么当我这样做时总是h
  • 如何使用javascript取消http请求

    我有一个页面 其中有一个事件处理程序附加到onclick事件 当事件触发时 它将文本框的内容传递给GET要求 自从url 不在同一个域中所以我创建一个脚本标签并将网址附加到其源 如下所示 elem onclick fire function
  • Express生成JSON

    我正在尝试传递一个键值并根据传递的键生成 JSON 响应 快速计划 var express require express async require async http require http mysql require mysql
  • 使用 mutate、cross、case_when 将多个变量设置为 NA 的类型冲突

    我想结合使用mutate across and case when将某些情况设置为NA 缺失 跨多个变量 假设我有一个指示变量 vs 标记案例 应该是NA对于变量 carb 和 gear 我想使用类似的方法将这些情况同时设置为缺少这两个变量
  • 如何在 Fortran 中实现数组结构而不是结构数组?

    我正在使用 Fortran 编写有关 CFD 主题的代码 在与一些计算机科学领域的朋友讨论后 他们告诉我 如果在他 她的代码中实现数组结构 SoA 而不是结构数组 AoS 可以加快计算时间 我见过很多关于这个主题的实现的例子 但大多数都是用