综合递归分块技术及其在数值计算中的应用
递归算法的理解和应用“兔子数列”.pptx

——递归算法的理解和应用
一个数学问题
假定一对刚出生的兔子一个月就能长成大兔子,再过一 个月就开始生下一对小兔子,并且以后每个月都生一对 小兔子。
设所生一对兔子均为一雄一雌,且均无死亡。 中世纪 意大利数学家 问:一对刚出生的小兔一年内可以繁殖成多少对兔子?
斐波那契
从问题描述中获取有价值的信息
一对刚出生的兔子一个月就能长成 大兔子,再过一个月就开始生下一 对小兔子,并且以后每个月都生一 对小兔子。
第一个月 只有一对小兔子
第二个月 只有一对大兔子
第三个月开始,每个月既有大兔子 也有小兔子
一对刚出生的小兔一年内可以繁 殖成多少对兔子?
求解问题:
初始条件:只有1对小兔子 求解目标:第12个月时,有多少兔子
否则
,执行递归关系式
结构化程序设计方法中, 利用条件控制语句,实现“如果……否则……”的逻辑关系
结 论 2:
用双分支选择结构(if……else……) 控制着 递归关系式
if
else
if( 递递归归边出界口条条件件 )
已知条件中,确定值的内容
else 递归关系式
关于“兔子问题”的递归程序实现
C语言程序实现:计算兔子数列问题
F( 6 )=8
• F( 9 ) • F( 8 )
• F( 5 )=5
• F(1•0F) ( 2 )=1
• F( 3 )=2
• F( 4 )=3
F( 8 )
F( 7 )
F(2)=1 ,根F(据1)=公1式计算F(12)的值 F( 9F()7 )=13 • F(• F8( )6 )=8
F( 8 )=21
返回值
选择结构
主函数
扩展递归技术

扩展递归技术
扩展递归技术是一种递归算法的变体,它在递归基础上加入了一些额外的步骤,从而使得算法更加高效、灵活和通用。
首先,扩展递归技术将递归算法的计算过程分为两个阶段:递归阶段和回溯阶段。
在递归阶段,算法按照递归规则向下递归,直到达到递归基,然后进入回溯阶段。
在回溯阶段,算法从下向上回溯,将计算结果传递给上一级递归,直到回到最初的递归层。
其次,扩展递归技术还可以引入一些辅助数据结构,如栈、队列、哈希表等,用于在递归过程中保存中间结果,避免重复计算和提高算法效率。
比如,在树的遍历算法中,可以使用栈来保存待访问的节点,从而避免递归过程中的重复遍历。
最后,扩展递归技术还可以使用一些优化策略,如剪枝、动态规划等,进一步提高算法效率和减少计算量。
比如,在图的最短路径算法中,可以使用动态规划算法计算出每个节点到起点的最短路径,从而避免重复计算和提高算法效率。
总之,扩展递归技术是一种非常重要的算法技术,可以大大提高递归算法的效率和通用性,应该在算法设计和实现中得到广泛应用。
- 1 -。
递归算法详解完整版

递归算法详解完整版递归算法是一种重要的算法思想,在问题解决中起到了很大的作用。
它通过将一个大问题划分为相同或类似的小问题,并将小问题的解合并起来从而得到大问题的解。
下面我们将详细介绍递归算法的定义、基本原理以及其应用。
首先,我们来定义递归算法。
递归算法是一种通过调用自身解决问题的算法。
它通常包括两个部分:基础案例和递归步骤。
基础案例是指问题可以被直接解决的边界情况,而递归步骤是指将大问题划分为较小问题并通过递归调用自身解决。
递归算法的基本原理是"自顶向下"的思维方式。
即从大问题出发,不断将问题划分为较小的子问题,并解决子问题,直到达到基础案例。
然后将子问题的解合并起来,得到原始问题的解。
递归算法的最大特点是简洁而优雅。
通过将复杂问题分解为简单问题的解决方式,可以大大减少代码的复杂程度,提高程序的效率和可读性。
但是递归算法也有一些缺点,包括递归深度的限制和复杂度的不确定性。
过深的递归调用可能导致栈溢出,而不合理的递归步骤可能导致复杂度过高。
递归算法有许多应用场景,我们来介绍其中一些典型的应用。
1.阶乘问题:计算一个数的阶乘。
递归算法可以通过将问题划分为更小的子问题来解决。
例如,n的阶乘可以定义为n乘以(n-1)的阶乘。
当n 等于1时,我们可以直接返回1作为基础案例。
代码如下:```int factorial(int n)if (n == 1)return 1;}return n * factorial(n - 1);```2.斐波那契数列问题:求斐波那契数列中第n个数的值。
斐波那契数列的定义是前两个数为1,然后从第三个数开始,每个数都是前两个数的和。
递归算法可以通过将问题划分为两个子问题来解决。
当n等于1或2时,直接返回1作为基础案例。
代码如下:```int fibonacci(int n)if (n == 1 , n == 2)return 1;}return fibonacci(n - 1) + fibonacci(n - 2);```3.二叉树问题:对于给定的二叉树,递归算法可以通过递归调用左子树和右子树的解来解决。
递归算法详解完整版

递归算法详解标准化管理处编码[BBX968T-XBB8968-NNJ668-MM9N]递归冯文科一、递归的基本概念。
一个函数、概念或数学结构,如果在其定义或说明内部直接或间接地出现对其本身的引用,或者是为了描述问题的某一状态,必须要用至它的上一状态,而描述上一状态,又必须用到它的上一状态……这种用自己来定义自己的方法,称之为递归或递归定义。
在程序设计中,函数直接或间接调用自己,就被称为递归调用。
二、递归的最简单应用:通过各项关系及初值求数列的某一项。
在数学中,有这样一种数列,很难求出它的通项公式,但数列中各项间关系却很简a与前面临近几项之间的关单,于是人们想出另一种办法来描述这种数列:通过初值及n系。
要使用这样的描述方式,至少要提供两个信息:一是最前面几项的数值,一是数列间各项的关系。
比如阶乘数列1、2、6、24、120、720……如果用上面的方式来描述它,应该是:a的值,那么可以很容易地写成这样:如果需要写一个函数来求n这就是递归函数的最简单形式,从中可以明显看出递归函数都有的一个特点:先处理一些特殊情况——这也是递归函数的第一个出口,再处理递归关系——这形成递归函数的第二个出口。
递归函数的执行过程总是先通过递归关系不断地缩小问题的规模,直到简单到可以作为特殊情况处理而得出直接的结果,再通过递归关系逐层返回到原来的数据规模,最终得出问题的解。
以上面求阶乘数列的函数)f为例。
如在求)3(f时,由于3不是特殊值,因此需(n要计算)2(3f,但)2(f是对它自己的调用,于是再计算)2(f,2也不是特殊值,需要计*算)1(f,返回)1(= 2f,需要知道)1(f的值,再计算)1(f,1是特殊值,于是直接得出1*上一步,得23*)2()3(==f,从而得最终=f)1(32**)2(==f2f,再返回上一步,得6解。
用图解来说明,就是下面再看一个稍复杂点的例子。
【例1】数列}{n a 的前几项为1、111+、11111++、1111111+++、……输入n ,编程求n a 的精确分数解。
从递归算法看数学在计算机程序设计方面的应用

及其重要 的地位. 同时 ,用数 擘的思维解决各种程序设 计方面的难题也 是十分重要的.在程序设计 当中所解决 的 相 当一部 分问题都会涉及到各种各样的科学计算 ,这需要程序 员将实际问题转换为程序 ,要经过对 问 题抽 象的过 程 ,建立起 完善的数学模 型,才能设计出好 的软件.文章将介绍递归算法在程序设计 中的应用并探讨数 学知识 在
要 证 明 该 定 理 对 于 l≤ N - + <k l一 定 是 正 确 的 . 一 旦 给 出 - -
了如何扩 展正确情 况的范围,就证明了该 定理对 于所有 的 情况都是正确的.
“ 兔子 ” 问题 图 解
逐月推算,我们可 以得到数 列:l ,2 ,5 , 。l ,3 ,8
I ,2 ,3 ,5 ,8 ,14 3 ,……数列 中的每一项 , 3 I 4 5 9 4 ,2 3 则称 为 “ 斐波那契数 ” .第 十三位的斐波 那契数 ,即为 一 对刚 出生 的 ,兔,一年 内所能繁殖成 的兔子 的对数 .从 斐 J 、
件 的时候应 当充分融入软件 的设计 思想 ,才能使硬件在程
序 的指挥下发挥极致 的性 能.在软件 设计的时候也要充分 考虑硬件 的特点 ,才 能冲破软件效率 的瓶 颈 .达到硬件和 软件设计的统一 ,一般 的程序设计 者很难将 这样 的思想贯 穿在其程序设计当中 .仅举个简单 的例子 ,我们 在写一些
定理 I 以通过如 下程序段来实现 ( + ) 可 C +: / /自然数列前 N项求和公式
p bi s t n it ) ul ai l gsn c t co ( n
收 稿 日期 :2 o .-0 0 763
作者简介 :马 良斋 (98 ) 17 ~ ,男,回族 ,兰州市人 ,兰州交通 大学电子与信息工程学院教 师,主 要从事计算机基础 的教
4.3 非数值计算(神奇的递归) 课件-2023—2024学年高中信息技术教科版(2019)必修1

知识探究:递归
递归是计算科学领域中一种重要的计算思维模式。它既是一种抽 象表达的手段,也是一种问题求解的重要方法。
直接或间接地调用自身的方法称为递归。可以将递归简单类比为 具有自相似性重复的事物。
知识探究:递归函数
递归函数是只用函数自身来定义该函数的方法。如斐波那契数列 “1,1,2,3,5,8,13……”,可以递归定义为:
迭代程序可以转换成等价的递归程序。以上一节中计算斐波那契数列第N项的值为例, 程序间的转换如表所示。
拓展知识
迭代
递归
两种算法均需重复执行某些代码
一次次重复过程
重复调用函数自己本身
从而接近或达到目标或结果 层层化解为规模较小的同类问题
三步骤:确定迭代变量 建立迭代关系式 控制迭代过程
递归二要素:递推+回归 步骤:确定递推关系式
F(n)=
1(n=1或n=2) F(n-1)+F(n-2)(n>2)
知识探究:递归的重要组成
1. 递推关系是递归的重要组成; 2. 边界条件是递归的另一要素(保证递归能在有限次计算后得出
结果,而不会产生无限循环地情况)
F(n)=
1(n=1或n=2)
边界条件
F(n-1)+F(n-2)(n>2)
递推关系
move(2,'b','a','c')
move(1,'a','b','c') print('a','-->','b') move(1,'c','a','b')
使用递归函数计算1到n的立方和
使用递归函数计算1到n的立方和递归函数是一种可以重复调用自身以解决问题的函数,有些时候,使用递归函数可以让程序更加简洁明了,因为它可以将复杂的问题分解为较小的问题来处理。
在计算机科学中,递归算法是一种经常使用的算法,它可以帮助我们处理许多不同的问题,包括计算数列、搜索算法,和图形问题等等。
本文将介绍如何使用递归函数计算1到n的立方和。
我们将给出一个详细的说明,帮助您了解什么是递归函数,以及为什么它在计算1到n的立方和方面是一个有用的工具。
1.了解递归函数在开始讨论递归函数之前,我们先来看一个简单的例子:要计算1到n的和,可以使用for循环语句来实现。
int sum = 0;for(int i=1; i<=n; i++){sum += i;}这段代码看起来很简单,但是在某些情况下,使用循环语句可能会让代码复杂化,而且有时候我们需要考虑更加通用和灵活的方法,这时递归函数就可以发挥作用。
递归函数是一种函数,它可以通过逐渐迭代一个问题的细节来解决通用的问题。
递归函数会不断调用自身,直到达到某个基本情况下停止。
每次迭代都会对问题的细节进行处理,直到最终达到整个问题的解决方案。
2.编写1到n的立方和的递归函数现在,我们将开始实现使用递归函数计算1到n的立方和的代码。
首先,我们需要定义一个函数,并设置一个终止条件。
在该递归函数中,终止条件是当我们的参数n达到1时,递归终止。
下面给出使用递归函数计算1到n的立方和的代码:int sumOfCubes(int n){if(n == 1) //基本情况return 1;else //递归情况return pow(n, 3) + sumOfCubes(n - 1);}在这个函数中,我们用if语句来判断当前的n是否为1,如果n 等于1,则是递归函数的终止条件,返回1。
如果n大于1,则继续递归,然后调用函数并传入n-1作为参数。
在递归函数内部,我们计算了当前值的立方,接着再加上从n-1到1的立方和。
数学中的递归关系与递推公式
在数学中,递归关系与递推公式是两个常常使用的概念。
它们用于描述数列、函数或者其他数学对象之间的关系,并且在数学问题的解决中起到了重要的作用。
在本文中,我们将详细讲述递归关系和递推公式的概念、性质以及应用。
首先,我们来看递归关系。
递归关系通常用于定义一个数列或者函数,它通过将问题分解为更小的子问题来进行定义。
具体来说,一个递归关系由两部分组成:初始条件和递归步骤。
初始条件是一个或一组已知的数值,用于开始递归过程。
递归步骤则描述了如何从已知的值推导出后续的值。
递归过程在每一步都会使用之前的值来计算新的值,直到得到所需的结果为止。
举一个简单的例子来说明递归关系。
考虑斐波那契数列,它定义如下:第一个数字为0,第二个数字为1,从第三个数字开始,每个数字都是前两个数字的和。
用递归关系来定义斐波那契数列可以写成:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2)。
我们可以看出,这个递归关系将问题分解为计算前面两个数字的和,这样就可以得到后续的数字。
递归关系的另一个重要应用是在数学归纳法的证明中。
数学归纳法是一种证明思想,用于证明一般情况下的命题。
它主要分为两个步骤:基础步骤和归纳步骤。
基础步骤是证明命题在某个特定情况下成立,而归纳步骤则是假设命题在某个情况下成立,然后通过递归关系证明在下一个情况下也成立。
递归关系在归纳步骤中起到了至关重要的作用,它提供了从一个情况到下一个情况的连接。
与递归关系相对应的是递推公式。
递推公式是一种通过前面的值计算出后续的值的公式。
它不需要进行递归的计算,而是直接使用已知的值进行计算。
递推公式在解决一些数学问题时具有很大的便利性,因为它们可以快速得到所需的结果。
递推公式与递归关系有着密切的联系。
事实上,递推公式可以从递归关系中推导出来,而递归关系也可以通过递推公式来表示。
它们在描述数学对象之间的关系时起到了互补的作用。
最后,我们来看一些常见的应用。
递归关系和递推公式广泛应用于数列、函数、动态规划等数学问题的解决中。
4.3非数值计算(神奇的递归)教学设计-2023—2024学年高中信息技术教科版(2019)必修1
板书设计
1.递归的概念与原理
①递归定义:一种自己调用自己的函数。
②递归结构:递归函数的调用过程。
③递归终止条件:确定递归何时停止。
2.递归的编程实现
①递归函数的实现:如何编写递归函数。
return fibonacci(n-1) + fibonacci(n-2)
```
3.例题三:递归求解汉诺塔问题
题目:编写一个递归函数,解决汉诺塔问题,将n个盘子从源柱子移动到目标柱子。
答案:
```python
def hanoi(n, source, target, auxiliary):
if n == 1:
2.鼓励学生探索递归算法的优化方法,如何减少递归调用栈的大小,避免栈溢出问题。可以让学生尝试研究一些经典的递归算法优化技巧。
3.让学生了解递归算法在实际软件开发中的应用,例如在编译器的设计中,递归用于解析语法树;在图形引擎中,递归用于计算视锥体内的物体数量等。可以提供一些实际的案例,让学生了解递归在实际项目中的应用。
4.3非数值计算(神奇的递归)教学设计-2023—2024学年高中信息技术教科版(2019)必修1
授课内容
授课时数
授课班级
授课人数
授课地点
授课时间
教材分析
本节课的主题是“4.3非数值计算(神奇的递归)教学设计-2023—2024学年高中信息技术教科版(2019)必修1”。本节课的内容主要包括递归的概念、递归的实现以及递归的应用。通过本节课的学习,学生能够理解递归的原理,掌握递归的编程实现,并能够运用递归解决实际问题。
第4章--递归技术
a.
返回地址、返 回值、实参、 局部变量
A(){ . . . B(); . . . }
a b c
16/27
b. c.
递归调用与普通调用本质上并无区别,只
2.3 递归调用的分类及递归调用分析
递归调用的分类 直接递归、间接递归、尾递归
A(){ . A(){ . . . B(); . . } B(){ . . . A(); . . } A(){ . A(){ . . . . B(); } B(){ . . . . A(); }
void listorder(int list[], int left, int right){
/*将数组段list[left..right]的元素按中点优先顺序输出*/ Left mid-1 mid mid+1 right int mid; 例如 if (left>right) 4 1 2 3 return;6 5 7 8 9 10 11 mid=(left+right)/2; 18 32 4 9 26 6 10 30 12 8 45 printf(“%4d”,list[mid]) ; //完成1:输出值 按中点优先顺序遍历的输出结果为: listorder(list,left,mid-1); 10 30 8 45 //完成2:输出左部 6 4 18 32 9 26 12 listorder(list,mid+1,right); //完成3:输出右部 } }
例如,求解0~n的累加和, sum(n)=0+1+2+……+n
易得初始条件:sum(0)=0; 先欲求解sum(i),假定sum(0) ~ sum(i-1)均已知,有: sum(i)=0+1+2+...+(i-1)+i =sum(i-1)+i; //得递推关系
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
综合递归分块技术及其在数值计算中的应用∗ 蒋孟奇1)2)3) 张云泉1)3) 宋刚1)2)3) 李玉成1) (1.中国科学院软件研究所并行计算实验室,北京市,100080) (2.中国科学院研究生院,北京市,100080) (3.中科院计算机科学国家重点实验室,北京市,100080)
摘要:矩阵计算在科学计算和其它很多的领域中有着广泛的应用。而随着计算机体系结构的不断发展,尤
其是分层存储的出现,现有的经典矩阵计算算法和传统数据结构已经不太适应新硬件发展的需要了。本文主要通过分析存储层次对矩阵计算的影响,结合近年来国内外的一些研究成果,提出了一种矩阵计算理念——计算重排序理论,并在此基础上提出了一种面向存储层次解决矩阵计算问题的方法——综合递归分块方法。对比实验表明,采用该方法既可以提高执行效率,又可以节省存储空间。
关键字:矩阵计算,分层存储,计算重排序,递归分块,非线性数据结构,综合递归分块技术
Integrated Recursive Blocking Technology and Its Application in Numerical Computing
JIANG Meng-qi1)2)3) ZHANG Yun-quan1)3) SONG Gang1)2)3) LI Yu-cheng1) (1. Lab of Parallel Computing, Institute of Software, CAS, Beijing, 100080, China) (2. Graduate School of the Chinese Academy of Science, Beijing, 100080, China) (3. State Key Lab of Computer Science, Institute of Software, CAS, Beijing, 100080, China)
Abstract: Dense Matrix Computations are widely used in numerical computations and other areas.
Along with the development of the computer architecture, especially the appearance of hierarchical memory, the classical algorithms and data structures have not been adapted to the change. This paper analyses the impact of hierarchical memory on the performance of matrix computations, and proposes a concept of computation reordering and a hierarchical memory oriented method -- Integrated Recursive Blocking Technology. The experimental results show that this method is not only improving the performance, but also saving the storage space.
Key words: Matrix computations, Hierarchical memory, Computation reordering, Recursive blocking
∗本工作得到国家自然科学基金(NO.60303020)、国家自然基金重点项目(No. 60533020),国家重点基础研究
发展计划(2005CB321702)、国家863“高性能计算机及其核心软件”重大专项课题“高性能计算机性能测试技术及方法研究”(NO. 2004AA104020)、北京邮电大学网络与交换技术国家重点实验室开放课题(2005-05)部分资助。 algorithm, Non-linear data structure 1. 引言 随着计算机性能的不断提高,计算问题的规模也不断扩大,无论计算机有多快,总有很多问题令它力不从心。因此,人们总是希望使计算机的计算能力发挥到极至。然而,这并不是一件容易的事情,其中一个很重要的原因就是存储器传输数据的速率远低于CPU处理数据的速率,如果希望得到比较高的性能,那么必须解决数据传输的问题。为了解决这个问题,分层存储的概念被引入体系结构(如图1所示),Cache,TLB等在很大程度上提高了存储器存取的速度。
图1 分层存储的结构 如果希望得到高效执行的程序,就需要考虑到分层存储对性能的影响,矩阵计算问题也不例外。在传统的矩阵计算中,算法通常是以行(列)为单位参与运算的,而数据结构是简单地按行(列)顺序存放元素的二维数组。这样做的问题主要有两个:第一,以行(列)为单位进行计算不利于Cache中数据的重复利用,会引起大量的Cache不命中,这一点将在第3节中详细说明;第二,按行(列)顺序存放的二维数组中,逻辑上连续的元素在物理存储空间上可能是不连续的,这样不能得到比较好的访问距离,会引起大量的TLB不命中,这一点将在第4节中详细说明。这样的计算违背了时间局部性和空间局部性的原则,使存储访问的速度大大影响了计算的速度。针对这些问题,我们将介绍一种新方法,使数据既可以在时间上相对集中,也可以在空间上相对集中,从而更好的利用分层存储结构的优势。 本文的结构如下:第2节介绍国内外的一些相关工作。第3节主要分析了存储层次对算法的影响,同时提出了矩阵计算的新理念——计算重排序理论,然后用此理论分析和比较了向量方法(不分块方法)、分块方法和递归分块方法。第4节通过分析存储层次、算法与数据结构之间的关系,提出了一种新型非线性数据结构——可调节递归分块数据结构。第5节将前两节的算法和数据结构统一成新的矩阵计算的方法——综合递归分块方法,并与传统的方法进行了比较。第6节将以Cholesky分解为例,实现新的矩阵计算方法,并做相关分析。第7节进行总结,并展望下一步的工作。 2. 相关工作 矩阵计算中的递归算法和非线性数据结构属于一个新兴的研究领域,目前在国内的研究还比较少。 在国外,递归算法和非线性数据结构首先用于矩阵相乘的运算中,由于矩阵相乘良好的性质,该方法大大提高了其执行效率。F.G.Gustavson等人对矩阵计算的新数据结构、递归方法和存储层次之间的关系做了深入的研究[3]。Chatterjee et al.比较了5种递归数据排列的方法,并将这些方法用于矩阵相乘[8]。Benckman在LU分解中使用了非线性的四叉树数据结构(QuadTree), David S.Wise对此数据结构进行了发展,将其用于基于Givens变换的QR分解,并得到了比较好的性能[7]。
3. 与存储层次相适应的算法 3.1 计算重排序 在矩阵计算中,从减少计算复杂度的角度提高性能是很困难的(如Strassen把矩阵相乘的运算量减少到原来的7/8[5]),而且针对不同的问题要使用不同的手段。相比之计算序列1 : 存储序列1 :C11= C11+ A11* B11 A11- B11- C11- C21= C21+ A21* B11 A21- B11- C21- C21= C21+ A22* B21 A22- B21- C21- C11= C11+ A12* B21 A12- B21- C11- C12= C12+ A11* B12 A11- B12- C12- C22= C22+ A21* B12 A21- B12- C22- C22= C22+ A22* B22 A22- B22- C22- C12= C12+ A12* B22 A12- B22- C12
计算序列2 : 存储序列2 :C11= C11+ A11* B11 A11- B11- C11- C11= C11+ A12* B21 A12- B21- C11- C12= C12+ A11* B12 A11- B12- C12- C12= C12+ A12* B22 A12- B22- C12- C22= C22+ A21* B12 A21- B12- C22- C22= C22+ A22* B22 A22- B22- C22- C21= C21+ A21* B11 A21- B11- C21- C21= C21+ A22* B21 A22- B21- C21
下,从另一个角度提高性能就显得更加“廉价”而有效,这就是在计算时间不变的条件下,减少数据存取的时间,从而减少总的执行时间。这样只需要改变算法的具体实现,而不需要改变算法的设计思想[1]。计算重排序的方法就是在这一指导思想下提出的。 下面先介绍几个概念:(1)计算序列:每个算法都要依靠具体的数学运算来实现,因此每个算法的具体执行都可以表示为一个数学运算的序列(序列的顺序由执行中的算式排列和控制转移等决定),这个序列称为计算序列,计算序列是由算法的具体实现决定的。(2)存储访问序列:每个算式在执行时都需要进行一系列的存取操作,这些数据存取的顺序称为存储访问序列,存储访问序列是由计算序列决定的。(3)计算重排序:就是在计算复杂度不变的前提下,改变运算序列,从而得到一种更优的存储访问序列,以达到数据局部化和数据重用的目的。 如图2所示,两个运算序列执行同样的计算任务(矩阵相乘),只是运算的次序有所不同,从而导致了存储访问序列不同。
图2 两个序列的比较 计算重排序的目的就是得到较优的存储访问序列,而什么样的序列较优呢?判断标准就是在一定硬件条件下存取开销的大小。存储访问序列中的数据分布在从寄存器到远程存储介质的各层存储中(如图1所示),显然数据所在的层次越高,存取的时间就越少。根据数据局部性原则,当数据比较集中时,相关的数据就容易在较高层次读取到。因此,计算重排序的核心思想就是使数据相对集中。 计算所用到的数据是否相对集中是由算法的存储访问序列和机器的存储系统共同决定的,衡量存储访问序列中数据是否集中的标尺主要是各层存储的容量(包括行长大小)及冲突管理策略等。下面以图2所示的两个序列为例说明这个问题,分两种情况讨论(假设存储为寄存器-Cache-内存三层结构,且Cache采用全相联映射,按LRU