章节摘要:Fortran 能在超算腹地活到今天,最大的本钱是数组。本章把数组从声明到性能契约讲全:列优先存储与缓存命中率的关系、切片与三元组、整体数组运算与掩码、构造器与 reshape 的零拷贝视角、假定形状与 contiguous 属性如何与编译器签订性能契约。读完本章,你会从"写循环算数组"切换到"声明式计算数组",并理解每条语法背后的内存行为。
阅读完本章,你应当能够:
金句:Fortran 的数组语法是写给编译器的情书——你写出数学,它负责把它变成能跑在硅片上的机器码。
从声明到整体运算:三要素、列优先布局、切片、三元组、where 掩码、sum/matmul 等内置过程。这一节是所有数组工作的语法基础。
数组怎么"生"出来、怎么"变"形态:构造器与隐含 do、reshape 的零拷贝视角、pack/unpack 的稀疏处理、merge 的无分支选择。数据形态流动的技术都在这里。
假定形状、延迟形状、自动数组三种声明的取舍,contiguous 属性与 SIMD 的关系,以及把数组当参数传递时如何保住优化机会。性能敏感的代码必须读这一节。
三节按"怎么表达 → 怎么变形 → 怎么保证性能"推进:3.1 教你用数组语言描述计算,3.2 教你在形态之间搬运数据,3.3 教你写出的代码别被编译器"保守处理"。3.1 和 3.2 是语法层,3.3 是语义层——前两节写不对,第三节谈不上;第三节不读,前两节的性能红利会打折扣。
3.1 数组语法与整体操作(怎么表达计算) │ ▼ 3.2 构造与重构(怎么搬运数据形态)──► 数据流动能力 │ ▼ 3.3 高级特性与性能契约(怎么保住优化)──► 第6章 并行计算
对性能敏感的读者,本章第三节比前两节更值得反复读。很多"同样的代码换台机器就慢了"的怪事,根源都在数组声明层:假定形状丢了连续性信息、切片实参破坏了局部性、临时数组隐式产生又隐式消失。编译器不是不优化,是信息不足时不敢优化。学会用 contiguous 和合理的布局把信息补齐,往往比任何微优化都见效。