精华内容
下载资源
问答
  • 局部性原理

    千次阅读 2018-05-26 17:50:22
    1、什么是局部性原理? 一个编写良好的计算机程序,它们倾向于引用邻近于其他最近引用过的数据项的数据项,或者最近引用过的数据项本身,我们称这种程序具有良好的局部性。这种倾向性,我们称之为局部性原理,是一个...

    1、什么是局部性原理?

    一个编写良好的计算机程序,它们倾向于引用邻近于其他最近引用过的数据项的数据项,或者最近引用过的数据项本身,我们称这种程序具有良好的局部性。这种倾向性,我们称之为局部性原理,是一个持久的概念,对于硬件和软件系统的设计和性能都有着极大的影响。

    2、局部性的形式

    时间局部性和空间局部性。在一个具有良好时间局部性的程序中,被引用过一次的存储器在不远的将来会被再次引用。在一个具有良好空间局部性的程序中,如果一个存储器位置被引用了一次,那么程序很可能在不远的将来引用附近的一个存储器的位置。

    3、局部性的应用

    在硬件层,局部性原理允许计算机设计者通过引入称为高速缓存存储器的小而快速的存储器来保存最近被引用的指令和数据项,从而提高对主存的访问速度。在操作系统级,局部性原理允许系统使用主存作为虚拟地址空间最近被引用块的高速缓存。

    4、局部性实例


     

    展开全文
  • 什么是程序的局部性原理

    千次阅读 2019-12-02 11:38:14
    01、前言 作为有追求的程序员,我们日常在写代码的时候往往都会运用很多奇技淫巧,不单单是为了炫耀我们的技术,更是为了追求更高的效率。...说到局部性原理,那我们首先要知道什么是局部性原理局部性原理...

    01、前言

    作为有追求的程序员,我们日常在写代码的时候往往都会运用很多奇技淫巧,不单单是为了炫耀我们的技术,更是为了追求更高的效率。了解局部性原理,可以有效的帮助我们理解和写出更好的代码,对于局部性原理可能有的小伙伴知道,有的小伙伴不知道,知道的小伙伴就当做复习知识点,不知道的小伙伴也没关系,接着往下看就知道了。

    02、什么是局部性原理

    说到局部性原理,那我们首先要知道什么是局部性原理,局部性原理分为两部分:

    • 时间局部性:指的是在程序运行过程中最近被引用到的存储器位置在程序执行后期还会被多次引用到的可能性很大。
    • 空间局部性:指的是程序运行过程中如果一个存储器的位置被引用,那么在程序执行后期该存储器附近的位置被引用的可能性很大。

    简单来说就是一个变量在程序运行过程中,如果被引用过一次,那后续很有可能会再被引用到;一个变量被访问到过后,这个变量所在的位置附近的位置很有可能在程序后续运行中被访问到。

    03、示例

    上面是通过理论来说明的,下面我们通过一段代码来看看局部性y原理

    public int sum(int[] array) {
            int sum = 0;
            for (int i = 0; i < array.length; i++) {
                sum = sum + array[i];
            }
            return sum;
    }
    

    从上面的这段代码来看,就是一个很简单的数组元素求和,这里我们主要看 sum 和 array 两个变量,我们可以看到 sum 在每次循环中都会用到,另外它只是一个简单变量,所以我们可以看到,sum 是符合我们上面提到的时间局部性,再访问一次后还会被继续访问到,但是它不存在我们所说的空间局部性了。

    相反的,array 数组中的每个元素只访问一次,另外数组底层的存储是连续的,所以 array 变量符合我们上面提到的空间局部性,但是不符合时间局部性。

    这只是局部性原理的简单示例,对于局部性原理还有很多地方会用到,我们如果能熟练的掌握和使用,对我们的帮助会很大的。

    04、相关应用

    4.1、CPU 缓存

    上面的示例其实很简单,相信大家都能理解,另外局部性原理其实在我们日常使用的软件中随处可见,并且在操作系统中也少不了。我们知道 CPU 的速度是非常快的,而且 CPU 与内存之间有多级缓存,如下图(图片来源于网络)

    image-20191129115010857.png

    为了充分的利用 CPU,操作系统会利用局部性原理,将高频的数据从内存中加载的缓存中,从而加快 CPU 的处理速度。

    4.2、广义局部性

    其实我们的局部性原理不单单是上面提到的狭义性的局部性,还可以是广义的局部性。我们系统里面的热点数据,CDN 数据,微博的热点流量等等这些都利用了局部性原理。只是我们可能没有意识到而已,实际上已经在使用了。我们会通过 Redis 缓存热点数据,会通过 CDN 提前加载图片或者视频资源,等等,都是因为这些数据本身就符合局部性原理,合理的利用局部性可以得到了能效、成本上的提升。

    4.3、利弊结合

    任何事情都是多面性的,局部性原理虽然我们使用起来很不错,可以提高系统性能,但是在有些场景下,我们是需要避免局部性原理的出现的。或者说出现了这种情况,我们需要人工处理。我们可以试想一下,如果在我们的一个大数据处理平台上,由于局部性原理的存在,导致我们部分节点数据庞大运算吃力,部分节点数据量小十分空闲,这种情况自然是不合理,我们就需要把数据按照业务场景进行重新分配,以达到整个集群的最大利用。

    05、总结

    今天给大家介绍了一下局部性原理,我们提到了时间局部性和空间局部性,通过一个代码示例和几个业务场景给大家简单介绍了局部性的使用。最后也提到局部性原理有利也有弊,我们需要根据业务场景和需求合理话的使用。

    展开全文
  • 局部性原理——各类优化的基石

    千次阅读 2019-07-28 16:38:21
    学过计算机底层原理、了解过很多架构设计或者是做过优化的同学,应该很熟悉局部性原理。即便是非计算机行业的人,在做各种调优、提效时也不得不考虑到局部性,只不过他们不常用局部性一词。如果抽象程度再高一些,...

    学过计算机底层原理、了解过很多架构设计或者是做过优化的同学,应该很熟悉局部性原理。即便是非计算机行业的人,在做各种调优、提效时也不得不考虑到局部性,只不过他们不常用局部性一词。如果抽象程度再高一些,甚至可以说地球、生命、万事万物都是局部性的产物,因为这些都是宇宙中熵分布布局、局部的熵低导致的,如果宇宙中处处熵一致,有的只有一篇混沌。

    所以什么是 局部性 ?这是一个常用的计算机术语,是指处理器在访问某些数据时短时间内存在重复访问,某些数据或者位置访问的概率极大,大多数时间只访问_局部_的数据。基于局部性原理,计算机处理器在设计时做了各种优化,比如现代CPU的多级Cache、分支预测…… 有良好局部性的程序比局部性差的程序运行得更快。虽然局部性一词源于计算机设计,但在当今分布式系统、互联网技术里也不乏局部性,比如像用redis这种memcache来减轻后端的压力,CDN做素材分发减少带宽占用率……

    局部性的本质是什么?其实就是概率的不均等,这个宇宙中,很多东西都不是平均分布的,平均分布是概率论中几何分布的一种特殊形式,非常简单,但世界就是没这么简单。我们更长听到的发布叫做高斯发布,同时也被称为正态分布,因为它就是正常状态下的概率发布,起概率图如下,但这个也不是今天要说的。
    在这里插入图片描述
    其实有很多情况,很多事物有很强的头部集中现象,可以用概率论中的泊松分布来刻画,这就是局部性在概率学中的刻画形式。
    在这里插入图片描述
    在这里插入图片描述
    上面分别是泊松分布的示意图和概率计算公式,λ\lambda 表示单位时间(或单位面积)内随机事件的平均发生次数,ee表示自然常数2.71828…,k表示事件发生的次数。要注意在刻画局部性时λ\lambda表示不命中高频数据的频度,λ\lambda越小,头部集中现象越明显。

    局部性分类

    局部性有两种基本的分类, 时间局部性空间局部性 ,按Wikipedia的资料,可以分为以下五类,其实有些就是时间局部性和空间局部性的特殊情况。

    时间局部性(Temporal locality):

    如果某个信息这次被访问,那它有可能在不久的未来被多次访问。时间局部性是空间局部性访问地址一样时的一种特殊情况。这种情况下,可以把常用的数据加cache来优化访存。

    空间局部性(Spatial locality):

    如果某个位置的信息被访问,那和它相邻的信息也很有可能被访问到。 这个也很好理解,我们大部分情况下代码都是顺序执行,数据也是顺序访问的。

    内存局部性(Memory locality):

    访问内存时,大概率会访问连续的块,而不是单一的内存地址,其实就是空间局部性在内存上的体现。目前计算机设计中,都是以块/页为单位管理调度存储,其实就是在利用空间局部性来优化性能。

    分支局部性(Branch locality)

    这个又被称为顺序局部性,计算机中大部分指令是顺序执行,顺序执行和非顺序执行的比例大致是5:1,即便有if这种选择分支,其实大多数情况下某个分支都是被大概率选中的,于是就有了CPU的分支预测优化。

    等距局部性(Equidistant locality)

    等距局部性是指如果某个位置被访问,那和它相邻等距离的连续地址极有可能会被访问到,它位于空间局部性和分支局部性之间。 举个例子,比如多个相同格式的数据数组,你只取其中每个数据的一部分字段,那么他们可能在内存中地址距离是等距的,这个可以通过简单的线性预测就预测是未来访问的位置。

    实际应用

    计算机领域关于局部性非常多的利用,有很多你每天都会用到,但可能并没有察觉,另外一些可能离你会稍微远一些,接下来我们举几个例子来深入了解下局部性的应用。

    计算机存储层级结构

    极客时间
    上图来自极客时间徐文浩的《深入浅出计算机组成原理》,我们以目前常见的普通家用电脑为例 ,分别说下上图各级存储的大小和访问速度,数据来源于https://people.eecs.berkeley.edu/~rcs/research/interactive_latency.html
    在这里插入图片描述
    从最快的L1 Cache到最慢的HDD,其两者的访存时间差距达到了6个数量级,即便是和内存比较,也有几百倍的差距。举个例子,如果CPU在运算是直接从内存中读取指令和数据,执行一条指令0.3ns,然后从内存读下一条指令,等120ns,这样CPU 99%计算时间都会被浪费掉。但就是因为有局部性的存在,每一层都只有少部分数据会被频繁访问,我们可以把这部分数据从底层存储挪到高层存储,可以降低大部分的数据读取时间。
      
    可能有些人好奇,为什么不把L1 缓存做的大点,像内存那么大,直接替代掉内存,不是性能更好吗?虽然是这样,但是L1 Cache单位价格要比内存单位的价格贵好多(大概差200倍),有兴趣可以了解下DRAM和SRAM。

    我们可以通过编写高速缓存友好的代码逻辑来提升我们的代码性能,有两个基本方法 。

    1. 让最常见的情况运行的快,程序大部分的运行实际都花在少了核心函数上,而这些函数把大部分时间都花在少量循环上,把注意力放在这些代码上。
    2. 让每个循环内缓存不命中率最小。比如尽量不要列遍历二维数组。

    MemCache

    在这里插入图片描述
    MemCache在大型网站架构中经常看到。DB一般公司都会用mysql,即便是做了分库分表,数据数据库单机的压力还是非常大的,这时候因为局部性的存在,可能很多数据会被频繁访问,这些数据就可以被cache到像redis这种memcache中,当redis查不到数据,再去查db,并写入redis。
      
    因为redis的水平扩展能力和简单查询能力要比mysql强多了,查起来也快。所以这种架构设计有几个好处:

    1. 加快了数据查询的平均速度。
    2. 大幅度减少DB的压力。

    CDN

    CDN的全称是Content Delivery Network,即内容分发网络(图片来自百度百科) 。CDN常用于大的素材下发,比如图片和视频,你在淘宝上打开一个图片,这个图片其实会就近从CDN机房拉去数据,而不是到阿里的机房拉数据,可以减少阿里机房的出口带宽占用,也可以减少用户加载素材的等待时间。
    在这里插入图片描述
    CDN在互联网中被大规模使用,像视频、直播网站,电商网站,甚至是12306都在使用,这种设计对公司可以节省带宽成本,对用户可以减少素材加载时间,提升用户体验。看到这,有没有发现,CDN的逻辑和Memcache的使用很类似,你可以直接当他是一个互联网版的cache优化。

    Java JIT

    JIT全称是Just-in-time Compiler,中文名为即时编译器,是一种Java运行时的优化。Java的运行方式和C++不太一样,因为为了实现write once, run anywhere的跨平台需求,Java实现了一套字节码机制,所有的平台都可以执行同样的字节码,执行时有该平台的JVM将字节码实时翻译成该平台的机器码再执行。问题在于字节码每次执行都要翻译一次,会很耗时。
      在这里插入图片描述
    图片来自郑雨迪Introduction to Graal ,Java 7引入了tiered compilation的概念,综合了C1的高启动性能及C2的高峰值性能。这两个JIT compiler以及interpreter将HotSpot的执行方式划分为五个级别:

    • level 0:interpreter解释执行
    • level 1:C1编译,无profiling
    • level 2:C1编译,仅方法及循环back-edge执行次数的profiling
    • level 3:C1编译,除level 2中的profiling外还包括branch(针对分支跳转字节码)及receiver type(针对成员方法调用或类检测,如checkcast,instnaceof,aastore字节码)的profiling
    • level 4:C2编译

    通常情况下,一个方法先被解释执行(level 0),然后被C1编译(level 3),再然后被得到profile数据的C2编译(level 4)。如果编译对象非常简单,虚拟机认为通过C1编译或通过C2编译并无区别,便会直接由C1编译且不插入profiling代码(level 1)。在C1忙碌的情况下,interpreter会触发profiling,而后方法会直接被C2编译;在C2忙碌的情况下,方法则会先由C1编译并保持较少的profiling(level 2),以获取较高的执行效率(与3级相比高30%)。

    这里将少部分字节码实时编译成机器码的方式,可以提升java的运行效率。可能有人会问,为什么不预先将所有的字节码编译成机器码,执行的时候不是更快更省事吗?首先机器码是和平台强相关的,linux和unix就可能有很大的不同,何况是windows,预编译会让java失去夸平台这种优势。 其次,即时编译可以让jvm拿到更多的运行时数据,根据这些数据可以对字节码做更深层次的优化,这些是C++这种预编译语言做不到的,所以有时候你写出的java代码执行效率会比C++的高。

    CopyOnWrite

    CopyOnWrite写时复制,最早应该是源自linux系统,linux中在调用fork() 生成子进程时,子进程应该拥有和父进程一样的指令和数据,可能子进程会修改一些数据,为了避免污染父进程的数据,所以要给子进程单独拷贝一份。出于效率考虑,fork时并不会直接复制,而是等到子进程的各段数据需要写入才会复制一份给子进程,故此得名 写时复制
      
    在计算机的世界里,读写的分布也是有很大的局部性的,大多数情况下读远大于写, 写时复制 的方式,可以减少大量不必要的复制,提升性能。 另外这种方式也不仅仅是用在linux内核中,java的concurrent包中也提供了CopyOnWriteArrayList CopyOnWriteArraySet。像Spark中的RDD也是用CopyOnWrite来减少不必要的RDD生成。

    处理

    上面列举了那么多局部性的应用,其实还有很多很多,我只是列举出了几个我所熟知的应用,虽然上面这些例子,我们都利用局部性得到了能效、成本上的提升。但有些时候它也会给我们带来一些不好的体验,更多的时候它其实就是一把双刃剑,我们如何识别局部性,利用它好的一面,避免它坏的一面?

    识别

    文章开头也说过,局部性其实就是一种概率的不均等性,所以只要概率不均等就一定存在局部性,因为很多时候这种概率不均太明显了,非常好识别出来,然后我们对大头做相应的优化就行了。但可能有些时候这种概率不均需要做很详细的计算才能发现,最后还得核对成本才能考虑是否值得去做,这种需要具体问题具体分析了。

    如何识别局部性,很简单,看概率分布曲线,只要不是一条水平的直线,就一定存在局部性。

    利用

    发现局部性之后对我们而言是如何利用好这些局部性,用得好提升性能、节约资源,用不好局部性就会变成阻碍。而且不光是在计算机领域,局部性在非计算机领域也可以利用。

    性能优化

    上面列举到的很多应用其实就是通过局部性做一些优化,虽然这些都是别人已经做好的,但是我们也可以参考其设计思路。

    恰巧最近我也在做我们一个java服务的性能优化,利用jstack、jmap这些java自带的分析工具,找出其中最吃cpu的线程,找出最占内存的对象。我发现有个redis数据查询有问题,因为每次需要将一个大字符串解析很多个键值对,中间会产生上千个临时字符串,还需要将字符串parse成long和double。redis数据太多,不可能完全放的内存里,但是这里的key有明显的局部性,大量的查询只会集中在头部的一些key上,我用一个LRU Cache缓存头部数据的解析结果,就可以减少大量的查redis+解析字符串的过程了。

    另外也发现有个代码逻辑,每次请求会被重复执行几千次,耗费大量cpu,这种热点代码,简单几行改动减少了不必要的调用,最终减少了近50%的CPU使用。

    非计算机领域

    《高能人士的七个习惯》里提到了一种工作方式,将任务划分为重要紧急、不重要但紧急、重要但不紧急、不重要不紧急四种,这种划分方式其实就是按单位时间的重要度排序的,按单位时间的重要度越高收益越大。《The Effective Engineer》里直接用leverage(杠杆率)来衡量每个任务的重要性。这两种方法差不多是类似的,都是优先做高收益率的事情,可以明显提升你的工作效率。

    这就是工作中收益率的局部性导致的,只要少数事情有比较大的收益,才值得去做。还有一个很著名的法则__82法则__,在很多行业、很多领域都可以套用,80%的xxx来源于20%的xxx ,80%的工作收益来源于20%的工作任务,局部性给我们的启示“永远关注最重要的20%” 。

    避免

    上面我们一直在讲如何通过局部性来提升性能,但有时候我们需要避免局部性的产生。 比如在大数据运算时,时常会遇到数据倾斜、数据热点的问题,这就是数据分布的局部性导致的,数据倾斜往往会导致我们的数据计算任务耗时非常长,数据热点会导致某些单节点成为整个集群的性能瓶颈,但大部分节点却很闲,这些都是我们需要极力避免的。

    一般我们解决热点和数据切斜的方式都是提供过重新hash打乱整个数据让数据达到均匀分布,当然有些业务逻辑可能不会让你随意打乱数据,这时候就得具体问题具体分析了。感觉在大数据领域,局部性极力避免,当然如果没法避免你就得通过其他方式来解决了,比如HDFS中小文件单节点读的热点,可以通过减少加副本缓解。其本质上没有避免局部性,只增加资源缓解热点了,据说微博为应对明星出轨Redis集群也是采取这种加资源的方式。

    参考资料

    1. 维基百科局部性原理
    2. 《计算机组成与设计》 David A.Patterson / John L.Hennessy
    3. 《深入浅出计算机组成原理》 极客时间 徐文浩
    4. 《深入理解计算机系统》 Randal E.Bryant / David O’Hallaron 龚奕利 / 雷迎春(译)
    5. interactive latencies
    6. Introduction to Graal 郑雨迪
    展开全文
  • 空间,时间局部性原理的具体应用

    千次阅读 2015-02-28 11:40:56
    讨论关于空间时间局部性的算法实现都是基于串行化原理处理的,并未引入并行化或是分布式并行处理的思想。我们下面将从此处着手,提出更加优化的算法。 3 并行处理 并行处理的基本思路就是利用多个部件完成同...

    http://www.cnblogs.com/haar/articles/1831169.html


    本文作者(吴猛,刘振),请您在阅读本文时尊重作者版权。

    摘要:该文就数值运算中常见的矩阵乘法运算的实现算法展开讨论,从时间和空间不同角度分析矩阵乘法运算中影响性能的主要因素,改良了原有算法,提出了基于存储优先的数据访问方式,并结合当今比较热门的并行运算机制,提高了矩阵乘积运算的速度。

    关键词:矩阵;复杂度;Cache miss;并行运算;存储;shared memory An Improved Parallel Matrix Multiplication Algorithm Based on Memory

    WU Meng, LIU Zhen

    (College of Computer Science and Technology, China University of Mining and Technology, Xuzhou 221008, China)

    Abstract: In this paper, we talk about the realization of the matrix multiplication algorithm, which is common in numerical calculation, from a different perspective of time and space matrix, and discuss its main factors affecting the performance, Improved the original algorithm, based on the priority of the data storage access methods, and compared with today's popular parallel computing mechanism, enhances the speed of the matrix multiplication operation.

    Key words: Matrix; complexity; Cache miss; parallel computing; storage; shared memory

    1 概述

    在数值计算中,矩阵乘法是最基本和经常使用的运算之一,它的性能对数值计算的操作性能产生直接的影响。我们知道,典型n×n稠密矩阵乘法运算的时间 复杂度为O(n3),它的平凡下界是O(n2)。可以用O(nw e)来表示标准矩阵的乘积运算复杂度,w表示n*n矩阵必须的复杂度2(e>0)[1]。后来Strassen引入分治思想将w e从3将为2.81(lg7),目前已知的最好计算时间上界是Coppersmith 和Shmuel Winograd 提出的O(n2.376)。

    目前,对于大型矩阵乘积运算的处理普遍采用分治思想,将运算分布在多个结点上。每个结点单独完成部分运算,然后将结果汇总。基于 Coppersmith和Shmuel Winograd的算法(甚至是Strassen的算法)实现复杂,在结点运算中,如果采用,不仅在算法实现难以实现,而且会导致大量的冗杂数据,CPU 运算次数少了,但是大量数据的频繁交换还是会使存储体的读取速度远不及CPU的速度,这样的交换在追求效益的社会上是不划算的,因而实际运算中采用的还是 经过优化了的普通矩阵乘法。

    本文从影响运算性能的实际因素中找到关键点,并由此提出优化算法,改善运行环境,从而解决矩阵乘法运算的效率问题。

    2 基本思想

    2.1 Cache miss以及分块思想

    矩阵乘法在算法上很容易实现,即三重循环 :

    matrix multiplication (a, b: matrices)

    for i:=0 to n-1

    for j:=0 to n-1

    begin

    cij :=0

    for q:=1 to n-1

    cij := cij aiq ×bqj

    end

    而由于计算机存取数据的时间已经对运算时间产生了影响,Cache的存在一定程度上解决了存储器传输速度和CPU处理速度的瓶颈。但对于大型的数据 处理时,数据的读写仍制约着运算的效率。在实际运算中,数据读写所花的时间已经远超过CPU有效处理时间。比如,上式中n很大,嵌套循环中的数据频繁访问 便导致cache hit次数的急剧下降,嵌套循环中的数据访问顺序也同样导致较多的Cache miss,如此繁琐无序的Cache读取使得CPU不得不从内存中单独读取所需的数据,而CPU对主存的访问时间是对Cache访问时间的10倍左右,使 得实际运算效率远远低于理论效率。如图1,当矩阵规模增加时,实际运算时间几乎成指数方式增长。

    由此可见,Cache的有效载入对运算性能的提升起到了举足轻重的作用。考虑到影响Cache hit次数的影响因素:1)空间局部性;2)时间局部性,我们从这两方面入手。

    2.1.1 空间局部性

    由于Cache读取数据是以块(block)为单位的,每操作一次内存,便读取相邻的一块数据。就数组形式存储的矩阵来说,一般情况下,其在内存中的存储方式是按行存储的。[2]即:

    Ad.a[s1,s2] = Ad.a[1,1] {(s1-1)*n (s2-1)}*k (k为元素大小)

    因而,在数据操作时尽可能的对连续数据进行集中处理。我们进行了如下处理:先将matrix b转置,得到bT,再与a相乘,于是在内层循环中可以对读取的连续数据块进行集中处理,而不是标准算法中对matrix b的跨空间读取,因而在数据较大时(Cache读取的一块存不了一次操作所需的所有数据),有效地降低了Cache miss次数。由图1可见,当N>500时,改良后的算法比普通算法有近一倍的性能提升。这里,我们姑且将此改良算法称为T-Matrix,即基于 存储访问方式优化的算法。

    进一步深入Cache的空间因素,当矩阵足够大时,Cache无法载入一行或一列,或是频繁的换行换列读取,直接导致了较多的Cache miss。采用分块思想可有效解决上述数据过大的问题。通过分块思想,集中访问取入Cache的块状矩阵,避免了全行全列的读写,增强了空间和时间的局部 性,分块的算法如下:

    Matrix multiplication (a, b: matricesnb:blockfactor)

    for x:=0 to N;y:=0 to N

    for i:=0 to N;j:=0 to nb

    r = 0;

    for k:=0 to nb

    r = r aik*bkj;

    cij =cij r;

    分块思想的难点和重点在于如何定分块的大小(即nb的大小),过大过小都可能影响运算性能[3]。根据一般层次,按行或按列分块的选择,可以有 2*2*2种选择(考虑到前一个矩阵的列数要和后一个矩阵的行数相同,即aik*bkj),上述分块算法在内层循环(也就是上述分块形式中最小块)重复使 用aik*bkj,而这些数据一直保存在Cache中,提高了Cache hit的效率。

    2.1.2 时间局部性

    在上例中,将要访问的一小块数据在统一的时间内集中处理,避免了不同时间重复读取相同数据的时间浪费,增强数据的可重复利用性,并将计算所得分批次 的顺序存储在matrix c中,这种实现机制从时间利用的角度出发,充分利用数据的重复使用特性,减少了数据读取的频繁程度,获得了较多的Cache hit次数。

    Begin

    for k:=0 to nb

    r = r aik*bkj;

    cij =cij r;

    end

    2.2 并行机制

    讨论关于空间时间局部性的算法实现都是基于串行化原理处理的,并未引入并行化或是分布式并行处理的思想。我们下面将从此处着手,提出更加优化的算法。

    3 并行处理

    并行处理的基本思路就是利用多个部件完成同一个任务。它的好处就在于可以很好的缩小解题规模和缩短解题时间,并且它对硬件的要求不高,因而可以有效地降低成本。

    基于分布式存储,将矩阵乘积运算划分成相对对立的几个模块,每个模块对应整个数据场的一小部分,而每个CPU则负责这数据处理这一小部分的数据,从而达到分而治之的目的。[4]

    基于上述原理,我们提出了并行处理下的优化算法,即PT-M。图1总体说明了算法的实现机制。Server是分发任务并将结果汇总,是整个系统的控制中心。

    一个Process对应着一块缓存区,将ai对应Process i以及所在的缓冲区。Server将ai复制到相应的缓冲区内,与共享内存中的matrix b完成最终的乘法运算,并将结果同样保存在shared memory中。图2显示了运算过程中数据在不同存储设备中的流向。

    算法实现:

    Begin:

    将ai按行分组至process i相应的缓冲区内

    求的bT;存储在shared memory中;

    for i:= 0 to n

    process i: ai*bT;结果存储在shared memory中;

    直接从shared memory读取最终的结果

    end

    4 测试结果及分析

    图3为T-M算法与其他算法的比较。

    图4显示了基于T-M算法优化后的并行运算在n = 4下和普通算法在运算时间上的对比。性能提升上基本在4倍以上,但在规模较小时(N<500),PT-M算法并没有多大优势。另外此种算法在稳定上还有待提高。

    5结束语

    本文从实际角度出发,就影响矩阵运算性能的因素逐步展开讨论,提出了更加优化的算法,并同其它算法进行了比较,验证了算法的有效性。并行运算在科学 运算中经常遇到,单它的实现较为复杂,实现过程中增加了不少外部因素,使得运行效率可能远不如原有算法。看来,关于并行运算的高效实现还有待进一步的研 究。

    参考文献:

    [1] Cohn H,Kleinberg R,Szegedy B,et al.Group-theoretic Algorithms for Matrix Multiplication[C].Proceedings of the 2006 international symposium on Symbolic and algebraic computation,2006.

    [2] Dhamfhere D M.系统编程与操作系统[M].北京:电子工业出版社,2001.

    [3] 蒋孟奇,张云泉,宋刚,李玉成.GOTOBLAS一般矩阵乘法高效实现机制的研究[J].计算机工程,2008,34(7):84-86.

    [4] 陈国良.并行算法的设计与分析[M].北京:高等教育出版社,2002.

    [5] Md Islam N, Md Islam S,Kashem M A,et al.An Empirical Distributed Matrix Multiplication Algorithm to Reduce Time Complexity[C].IMECS 2009,2009.


    展开全文
  • 常用概念之程序局部性原理

    千次阅读 2017-06-10 19:55:56
     在现代计算机系统的各个层次,从硬件到操作系统、应用程序等,设计上都利用了局部性原理。比如缓存机制,CPU指令顺序处理等。  局部性通常有两种形式:时间局部性和空间局部性,下面分别进行
  • 操作系统的局部性原理

    千次阅读 2019-11-05 18:47:23
    局部性原理:一个良好的计算机程序 常常具有良好的局部性,也就是说,它们倾向于引用邻近于其他最近引用过的数据项的数据项,或者最近引用过的数据项本身。 局部性的两种不同的形式:时间局部性和空间局部性 时间...
  • 3.程序的局部性原理

    2018-09-11 17:16:26
    在现代计算机系统的各个层次,从硬件到操作系统、应用程序等,设计上都利用了局部性原理。比如缓存机制,CPU指令顺序处理等。 局部性通常有两种形式:时间局部性和空间局部性。 时间局部性(temporal loc...
  • 局部性原理的一点理解

    千次阅读 2016-01-23 19:02:59
    这汇总倾向性,就被称为局部性原理,这是一个持久的概念,对硬件和软件系统的设计和性能都有着极大的影响。 局部性通常有两种不同的形式:时间局部性和空间局部性。在一个具有良好时间局部性的程序中,被引用一次的...
  • 程序的局部性原理

    千次阅读 2012-04-23 20:32:32
    程序的局部性原理是指程序总是趋向于使用最近使用过的数据和指令,也就是说程序执行时所访问的存储器地址分布不是随机的,而是相对地簇集;这种簇集包括指令和数据两部分。 程序局部性包括程序的时间局部性和程序的...
  • 计算机基础之局部性原理(十)

    千次阅读 2018-06-05 21:42:32
    局部性原理 局部性原理是指CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。 –来自百度百科 三种不同类型的局部性原理 时间局部性 如果有一个数据被访问...
  • 局部性原理与磁盘预读原理来了解索引机制

    千次阅读 多人点赞 2019-11-26 16:52:44
    参考文章,链接如下: https://blog.csdn.net/coolwriter/article/details/80346454 https://blog.csdn.net/u010727189/article/details/79399384 ... 目录 局部性原理...
  • 随笔七:高速缓存的局部性原理

    千次阅读 2012-06-19 14:52:12
    高速缓存的局部性原理,即程序具有访问局部区域的数据和代码的趋势。通过让高速缓存里存放可能经常访问的数据的方法,大部分的存储器操作都能在快速的高速缓存中完成。  重要结论:意识道高速缓存存在的应用程序员...
  • 程序设计原则——局部性原理

    千次阅读 2010-08-15 20:52:00
    存储器系统是一个具有不同容量、成本和访问时间的存储...局部性:一般较好的程序都有较好的局部性,也就是说,它们倾向于引用的数据项邻近于其他最近引用过的数据项,或者邻近于最近自我引用过的数据项。对应的就是空
  • 一文搞定BP神经网络——从原理应用原理篇)

    万次阅读 多人点赞 2017-10-11 09:31:25
    神经网络结构以及前向传播过程 损失函数和代价函数 ...Hello,对于神经网络的原理,我入门了好多次,每次都觉得懂了,但是其实内部原理并没有理解透彻。经过不懈努力,终于茅塞顿开,遂总结此文。 本
  • 原理篇-局部性与并行性

    千次阅读 2008-08-07 00:38:00
    概要:局部性原理是计算机系统最重要的理论。也是软件优化的最重要的基础。而系统的并行性,则保证了系统资源的充分使用。最理想的,最高效的软件就是系统的各个部件(CPU,内存,I/O设备等)都充分运转,而彼此间的...
  • TRIZ系列-创新原理-3-局部质量原理

    千次阅读 2014-10-08 20:35:40
    局部质量原理的基本表述如下:1)将物体、环境或外部作用的均匀结构,变为不均匀的;2)让物体的不同部分,各具有不同的功能;3)让物体的各部分,均处于完成各自动作的最佳状态。局部质量原理是技术系统不均衡进化...
  • 局部性

    千次阅读 2015-10-16 11:08:16
    这种倾向性,被称为局部性原理(principle of locality),是一个持久的概念,对硬件和软件系统的设计都有着极大影响。  局部性通常有两种形式:时间局部性(temporal locality)和空间局部性(spat
  • 随着信息膨胀时代的来临,算法也在不断的精进,相似算法同样在不断的发展,接触过lucene的同学想必都会了解相似夹角的概念,那就是一种相似算法,通过计算两个向量的余弦值来判断两个向量的相似,但这种方式需要...
  • 局部性原理 计算机中的局部性设计来源于缓存的概念,由于存储器的速度不一样,寄存器>高速缓存存储器>主存>磁盘,为了提高系统的运行速度,会将近期使用的数据存储在高速存储器(空间小,昂贵)中,这个就是缓存...
  • 滤波器的作用与原理应用

    万次阅读 多人点赞 2018-01-23 11:07:30
    采用了先进微电子加工技术制造的声表面波器件,具有体积小、重量轻、可靠高、一致好、多功能以及设计灵活等优点。   介质滤波器  介质滤波器利用介质陶瓷材料的低损耗、高介电常数、频率温度系数和热...
  • 物联网的原理应用和技能

    万次阅读 2019-02-09 10:29:17
    1物联网的原理 物联网是在计suanji互联网的基础shang,li用RFID、无xian数据通讯deng技能,构zaoyi个覆盖世界shang万shi万物的InternetofThings。在这个网络中,物pin商品)ke以互xiang进行“jiao流”,而无需人的...
  • CAN总线原理应用系统设计[PDF]

    千次下载 热门讨论 2009-09-30 15:38:41
    下面是CAN总线原理应用系统设计的目录 目录: 引论 1.1 计算机网络和协议 1.1.1 计算机网络 1.1.2 协 议 1.1.3 计算机网络体系结构 1.2 局域网 1.2.1 概 述 1.2.2 局域网协议 1.3 现场总线 1.3.1 背景和发展 1.3.2...
  • 数据库原理应用课程设计

    千次阅读 多人点赞 2020-05-13 11:43:27
    数据库原理应用课程设计 西南石油大学 课 程 设 计 报 告 课程名称 数据库原理应用 设计题目 学生信息管理系统数据库设计与实现 专 业 网络空间安全 班 级 网安03 学 号 姓 名 完成日期 20200511 任 务 书 设计...
  • 一文搞定卷积神经网络——从原理应用

    万次阅读 多人点赞 2019-01-07 19:40:20
    本文和《BP 神经网络入门:从原理应用》一文一脉相承,因此,我希望读者务必先看看这篇文章(链接在这里: BP 神经网络入门:从原理应用 , ​ 好多读者都说,之前那篇BP神经网络的文章,公式太多,阅读体验...
  • 机械相似代表着,两个文本内容上的相关程度,比如“你好吗”和“你好”的相似,纯粹代表着内容上字符是否完全共现,应用场景在:文章去重; 语义相似代表着,两个文本语义上的相似程度,比如“苹果”和“公司...
  • 大数据技术原理应用-林子雨版-课后习题答案

    万次阅读 多人点赞 2019-06-26 13:29:23
     物联网是物物相连的互联网,是互联网的延伸,它利用局部网络或互联网等通信技术把传感器、控制器、机器、人类和物等通过新的方式连在一起,形成人与物、物与物相连,实现信息化和远程管理控制。 12.详细阐述...
  • NAT基本原理应用

    万次阅读 多人点赞 2017-07-03 20:31:36
    也叫全局地址,是指合法的IP地址,它是由NIC(网络信息中心)或者ISP(网络服务提供商)分配的地址,对外代表一个或多个内部局部地址,是全球统一的可寻 址的地址。 私有IP地址: 也叫内部地址,属于非注册地址...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 133,772
精华内容 53,508
关键字:

局部性原理的应用