You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fortran列主序下两种数组运算代码的性能对比咨询

Fortran两段代码的性能对比解答

你的推测完全正确,第二段代码的执行速度会显著快于第一段,核心原因在于Fortran的列主序存储特性对内存访问效率的影响,具体分析如下:

1. Fortran列主序存储的核心特点

Fortran数组采用**列主序(Column-major)**存储,即数组的列元素在内存中连续排列。比如对于y(j×k)数组,内存中的存储顺序是:
y(1,1) → y(2,1) → ... → y(j,1) → y(1,2) → y(2,2) → ... → y(j,k)
连续内存访问能充分利用CPU缓存,大幅提升数据读取效率;而非连续访问会频繁触发缓存未命中(Cache Miss),导致CPU等待内存数据,严重拖慢性能。

2. 第一段代码的内存访问瓶颈

第一段中y(j,:)是取y数组的第j行所有元素。根据列主序的存储规则,这些元素在内存中是分散的(每个元素间隔j个内存单元),属于非连续内存访问。循环执行100×12=1200次这样的操作,会产生大量缓存未命中,导致性能低下。

3. 第二段代码的高效内存访问

第二段中使用了转置后的y_transpose(:,j):

  • y_transpose是y的转置,维度变为k×j,原y的行元素变成了y_transpose的列元素;
  • y_transpose(:,j)取的是y_transpose的第j列所有元素,这部分在内存中是连续存储的,每次访问都能命中CPU缓存,数据读取效率极高。

4. 转置的开销对比

虽然数组转置本身需要一定计算资源,但这里j的取值仅为12,k为100,转置的一次性开销远小于循环中1200次非连续访问带来的性能损失,整体来看第二段代码的总耗时会远低于第一段。

内容的提问来源于stack exchange,提问作者cjp1032

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 10:50:58