第3章 数组编程:数值计算的核心引擎


第3章 · 数组编程:数值计算的核心引擎

章节摘要:Fortran 能在超算腹地活到今天,最大的本钱是数组。本章把数组从声明到性能契约讲全:列优先存储与缓存命中率的关系、切片与三元组、整体数组运算与掩码、构造器与 reshape 的零拷贝视角、假定形状与 contiguous 属性如何与编译器签订性能契约。读完本章,你会从"写循环算数组"切换到"声明式计算数组",并理解每条语法背后的内存行为。

学习目标

阅读完本章,你应当能够:

  1. 说出秩、形状、大小三要素,并画出二维数组在内存中的列优先布局
  2. 熟练使用切片、三元组与向量下标访问数组子集,并预判访问是否连续
  3. 用整体数组运算、where 与 merge 写出无显式循环的向量化代码
  4. 用数组构造器、reshape、pack/unpack 完成数据形态的流动与重塑
  5. 区分假定形状、延迟形状、自动数组三种声明,并说明各自的内存位置
  6. 解释 contiguous 属性如何消除编译器对内存步长的疑虑,从而解锁 SIMD

核心概念速览

金句:Fortran 的数组语法是写给编译器的情书——你写出数学,它负责把它变成能跑在硅片上的机器码。

子章节导航

3.1 数组语法与整体操作

从声明到整体运算:三要素、列优先布局、切片、三元组、where 掩码、sum/matmul 等内置过程。这一节是所有数组工作的语法基础。

3.2 数组构造、重构与掩码运算

数组怎么"生"出来、怎么"变"形态:构造器与隐含 do、reshape 的零拷贝视角、pack/unpack 的稀疏处理、merge 的无分支选择。数据形态流动的技术都在这里。

3.3 高级数组特性与性能契约

假定形状、延迟形状、自动数组三种声明的取舍,contiguous 属性与 SIMD 的关系,以及把数组当参数传递时如何保住优化机会。性能敏感的代码必须读这一节。

子章节之间的逻辑关系

三节按"怎么表达 → 怎么变形 → 怎么保证性能"推进:3.1 教你用数组语言描述计算,3.2 教你在形态之间搬运数据,3.3 教你写出的代码别被编译器"保守处理"。3.1 和 3.2 是语法层,3.3 是语义层——前两节写不对,第三节谈不上;第三节不读,前两节的性能红利会打折扣。

3.1 数组语法与整体操作(怎么表达计算) │ ▼ 3.2 构造与重构(怎么搬运数据形态)──► 数据流动能力 │ ▼ 3.3 高级特性与性能契约(怎么保住优化)──► 第6章 并行计算 ​

前置知识与后续延伸

  • 前置知识:第 2 章的 kind 与 allocatable(数组声明的两件基础工具),以及第 1 章"数组优先"设计哲学。
  • 后续延伸:数组是第 6 章并行计算的载体(协同数组本质是分布式数组,OpenMP 作用对象也是数组),第 7 章互操作中的零拷贝数组共享依赖本章的存储布局理解,第 8 章性能调优会回到本章的连续性与切片话题。

对性能敏感的读者,本章第三节比前两节更值得反复读。很多"同样的代码换台机器就慢了"的怪事,根源都在数组声明层:假定形状丢了连续性信息、切片实参破坏了局部性、临时数组隐式产生又隐式消失。编译器不是不优化,是信息不足时不敢优化。学会用 contiguous 和合理的布局把信息补齐,往往比任何微优化都见效。

作者与出处
原作者:灏天文库
来源:平台策划编纂
整理人: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U