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
相关产品推荐
相关产品推荐

