精华内容
下载资源
问答
  • 程序设计原则——局部性原理

    千次阅读 2010-08-15 20:52:00
    存储器系统是一个具有不同容量、成本和访问时间的存储设备的层次结构:CPU寄存器-》高速缓冲存储器-》主存储器-》磁盘-》通过网络连接的其他存储设备。SRAM静态,一般作为高速缓冲存储器。...对应的就是空

    存储器系统是一个具有不同容量、成本和访问时间的存储设备的层次结构:CPU寄存器-》高速缓冲存储器-》主存储器-》磁盘-》通过网络连接的其他存储设备。

     

    SRAM静态,一般作为高速缓冲存储器。

    DRAM动态,一般作为大容量的主存储器

     

    每次CPU和主存之间的数据传送都是通过一些列的步骤完成的,这些步骤称为总线事务。读事务从主存传送数据到CPU,写事务从CPU传送数据到主存。

     

    局部性:一般较好的程序都有较好的局部性,也就是说,它们倾向于引用的数据项邻近于其他最近引用过的数据项,或者邻近于最近自我引用过的数据项。对应的就是空间局部性和时间局部性

     

    局部性小结:

    1、重复引用同一变量的程序有较好的时间局部性。

    2、对于具有步长为k的引用模式的程序,步长越小,空间局部性就越好。具有步长为1的引用模式的程序有很好的空间局部性。在存储器中以大步跳来跳去的程序的空间局部性就很差。

    3、对于取指令来说,循环有很好的空间和时间局部性。循环体越小,循环迭代次数越多,局部性越好。

     

    编写高速缓存友好的代码

    编写高速缓冲友好的代码的基本方法:

    1、让最常见的情况运行得快。程序通常把大部分时间都花在少量的核心函数上,而这些函数通常把大部分时间都花在了少量的循环上。所以要把注意力集中在核心函数的循环上,而忽略其他部分。

    2、在每个循环内部使缓存不命中数量最小。在其他条件,例如加载和存储的总次数相同的情况下,不命中率低的程序运行得更快。

     

    注意:编译器将局部变量存储到寄存器中,因此循环内对局部变量的引用不需要任何加载或存储指令。

     

    高速缓存对程序性能的影响:

    1、通过重新排列循环以提高空间局部性:降低高速缓冲的不命中率。例子(求两个矩阵的乘积)

    2、使用分块来提高时间局部性

    分块的大致思想是将一个程序中的数据结构组织成称为块(block)的组块(chunk)。这里的“块”指的是一个应用级的块,不是高速缓冲块。这样构造程序,使得能够将一个块加载到L1高速缓存中,并在这个块中进行所需的所有的读和写,然后丢掉这个块,加载下一个块,以此类推。

    但是分块可能带来的负面影响就是会降低程序的可读性。

     

    在程序中利用局部性:

    为了编写更有效的程序,不论具体的存储结构是怎样的。推荐以下技术:

    1、将注意力集中在内部循环上,大部分计算和存储器访问都发生在这里。

    2、通过按照数据对象存储在存储器中的顺序来读取数据,从而使程序的空间局部性最大。

    3、一旦从存储器中读入了一个数据对象,就尽可能多的使用它,从而使得程序的时间局部性最大。

    4、记住,不命中率只是确定代码性能的一个因素(虽然是重要的)。存储器访问数量也扮演中重要的角色,有时需要在两者之间做一个折中。

     

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~·

     

    这里在补充一些有关高速缓冲存储器的内容:

     

    对于一个计算机系统,如果每个存储器的地址有m位,可形成M=2m个不同的地址。而高速缓存一般被组织成一个S=2s个高速缓存组(cache set)的数组。每个组包含E个高速缓存行(cache line)。每一行由B=2b字节的数据块(block)组成。一个有效位(valid bit)指明这个行包含的数据是否有效,还有t=m-(b+s)个标记位(tag bit)(是当前块的存储器地址的位子集),它们唯一的标示存储在这个高速缓存行中的块。

     

    高速缓存的大小指的是所有块的大小的和(不包括有效位和标记位在内)。因此C=S*E*B。

     

    高速缓存主要分为:直接映射高速缓存(每一组只有一行),组相联高速缓存(每一组有两行以上),全相联高速缓存(只有一个组,这个组包含了所有的行)。

     

    注意:高速缓存加载数据时是以每一行的块大小来加载数据的,所以正是基于这一点,我们才能利用高速缓存来提高程序性能。

    小技巧:当数组的大小是2的幂时,直接映射高速缓存中通常很容易发生冲突不命中,一般可以通过在数组尾部进行填充来完成“抖动”现象(即,数据反复在高速缓存中发生不命中,而频繁的换进换出)。

    但是我看了一下,现在的计算机一般在d-cache、i-cache、二级缓存使用的都是组相联或全相联形式。

     

    注意:高速缓存利用的是地址位的中间位作为缓存的索引,所以这样做相对于使用地址高位作为索引的好处是,主存相邻的块总是映射到不同的高速缓存行。这一点又是我们可以利用在程序性能提高上的原理所在。

     

     

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

     

    /*
     * 高速缓冲实验
     * 发现:
     * 1、如果在内层循环中,存储器加载和存储次数相同的情况下,高速缓冲命中率的高低
     * 反映在程序执行时间上要相差大约200~300ms
     * 2、高速缓冲命中率只是一个因素,循环中存储器的加载次数和存储次数也是会起到很大的
     * 影响,第一个测试程序就比第二个测试程序运行效率更高,虽然它命中率没有另一个高
     * 3、这种高速缓冲的效果一般在较大数据集上,才有明显的差异,所以如果在数据集比较小的情况下,不用在这个高速缓冲上花心思
    */

    #include<iostream>
    #include<ctime>
    using namespace std;
    #define MAXSIZE 400
    #define bsize 25

     

    int main(){
     
     int a[MAXSIZE][MAXSIZE],b[MAXSIZE][MAXSIZE],c[MAXSIZE][MAXSIZE];
     
     int i,j,k,r,kk,jj;
     int sum;

    //初始化数组
     for(i=0;i<MAXSIZE ; i++) 
      for(j=0;j<MAXSIZE ; j++){  //这里初始化的过程对高速缓冲是不友好的
       a[i][j]=1;
       b[i][j]=1;
       c[i][j]=0;
      }
         
      

     clock_t time=clock();
     

     

     

    //第一个测试程序
    for(i=0 ; i<MAXSIZE  ; i++){
      
      for(j=0 ;j<MAXSIZE  ;j++){
       
       sum=0;
       for(k=0;k<MAXSIZE; k++){
        
        sum+= a[i][k]*b[k][j];  //每次迭代加载2次,存储0次,a[][]按列读取,b[][]按行读取
       }
       c[i][j]+=sum;
      }
      
     }
     


     //第二个测试程序

    for(i=0;i<MAXSIZE ; i++){
      
      for(k=0 ;k<MAXSIZE ;k++){
       
       r = a[i][k];
       for(j=0 ;j<MAXSIZE ; j++){ //每次迭代加载2次,存储1次,c[][]按列读取,b[][]按列读取
        
        c[i][j]+=r*b[k][j];
       }
      }
     }
     

    //第三个测试程序

     for(j =0 ; j<MAXSIZE ; j++){
      
      for( k=0 ;k<MAXSIZE ; k++){
       
       r=b[k][j];
       for(i=0; i<MAXSIZE ; i++) //每次迭代加载2次,存储1次,a[][]按行读取,c[][]按行读取
        c[i][j]+=a[i][k]*r;
      }
     }
     
     

    //第五个测试程序:程序分块
     int en=bsize*(MAXSIZE/bsize);
     
     for(kk=0 ;kk<en ; kk+=bsize){
      
      for(jj=0; jj < en ; jj+=bsize){
       
       for(i= 0 ; i<MAXSIZE ;i++){
        
         for( j=jj ; j< jj+bsize ; j++){
          
          sum = c[i][j];
          for( k =kk ; k< kk+bsize ; k++){
           sum+=a[i][k]*b[k][j];
          }
          c[i][j]=sum;
         }
       }
      }
     }
     
     
     
     cout<<"计算用时:"<<clock()-time<<"MS"<<endl;
     return 0;

    }

     

    展开全文
  • 深入解析ace架构设计与实现原理》从构架模式、编程示例和源代码3个维度系统地对经典网络框架ace(adaptivemunicationenvironment)架构设计和实现原理进行了深入分析,它能解决4个方面问题:,帮助框架设计者...
  • 我想开发录制回放、故障模拟、动态日志、行链路获取等等工具,就算我开发完成了,这些工具底层实现原理相同,同时使用,要怎么消除这些工具之间影响,怎么保证这些工具动态加载,怎么保证动态加载/卸载之后不会...
  • 4.4.2 对应于类型层次外延约束 72 4.5 复杂对象 72 4.5.1 非结构化复杂对象和类型可扩展性 73 4.5.2 结构化复杂对象 73 4.6 其他面向对象概念 74 4.6.1 多态性(操作符重载) 74 4.6.2 ...
  • BGP(Border Gateway Protocol)是一种自治系统间的动态路由协议,它基本功能是在自治系统间自动交换无环路路由信息,通过交换带有自治系统号序列属性路径可达信息,来构造自治区域拓扑图,从而消除路由环路...
  • 抢答器的工作原理是利用单片机的定时器T0、T1中断完成,其余状态循环调用显示子程序,用4个共阴极LED数码管来显示,用P1口作为数码管的八个段选,由于P1口为高电平呈输入状态,当有按键按下时,P1口呈高电平与按键对应...
  • 尽我所知,除了文中特别加以标注和致谢地方外,论文中不包含其他人已经发表或撰写过研究成果,也不包含为获得东南大学或其它教育机构学位或证书而使用过材料。与我一同工作同志对本研究所做任何贡献均已...
  • 二叉排序树与平衡二叉树实现

    热门讨论 2010-12-26 15:25:31
    建立二插排序树,首先用一个一维数组记录下读入数据,然后再用边查找边插入方式将数据一一对应放在完全二叉树相应位置,为空树结点用“0” 补齐。 1.2.2 建立二叉排序树 二叉排序树是一种动态树表。其特点...
  • 9.1.2 使用MDB设计原则 348 9.2 使用消息驱动Bean 349 9.2.1 使用@MessageDriven和@ActivationConfigProperty 350 9.2.2 实现MessageListener 352 9.2.3 MDB生命周期 353 9.2.4 MDB中依赖注入 356 9.2.5 事务...
  • 3.5.1 找出给定字符串对应的序号 3.5.2 找出第k大的数字所在的位置。写一段程序,找出数组中第k大小的数,输出数所在的位置。例如{2,4,3,4,7}中,第一大的数是7,位置在4。第二大、第三大的数都是4,位置在1、3...
  • 我们不仅会介绍C#语言的基础,还会给出使用各种相关技术的应用程序对应的示例,包括数据库访问、动态的Web页面、高级的图形和目录访问等。 Windows API自从1993年发布的Windows NT以来一直在演化和扩展,但自从2002...
  • 软件工程教程

    热门讨论 2012-07-06 23:10:29
    应用计算机科学、数学及管理科学等原理,以工程化的原则和方法来解决软件问题,指导计算机软件开发和维护的一门工程学科。  软件工程的原则 任务2 软件生命周期与软件开发模型 软件生命周期 软件开发模型 ...
  • 队列的修改是依照先进先出的原则进行的,因此队列也称为先进先出的线性表,或者后进后出的线性表。例如:火车进遂道,最先进遂道的是火车头,最后是火车尾,而火车出遂道的时候也是火车头先出,最后出的是火车尾。若...
  • c语言编写单片机技巧

    2009-04-19 12:15:17
    嵌入式微处理器就是和通用计算机的微处理器对应的CPU。在应用中,一般是将微处理器装配在专门设计的电路板上,在母板上只保留和嵌入式相关的功能即可,这样可以满足嵌入式系统体积小和功耗低的要求。目前的嵌入式...
  • CruiseYoung提供带有详细书签电子书籍目录 http://blog.csdn.net/fksec/article/details/7888251 Oracle Database 11g数据库管理艺术(涵盖DBA必知必会所有数据库管理知识) 基本信息 原书名: Expert Oracle ...
  • 其中: @Autowired注解, 表示从Spring IoC容器中根据类型找到对应的bean,并自动注入到某个字段上 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") public class...
  • Reversing:逆向工程揭密

    热门讨论 2010-06-21 17:00:47
    第二类是从没有源代码的程序出发,生成对应的源程序、系统结构以及相关设计原理和算法思想的文档等,亦即本书重点讨论的二进制逆向工程。 本书共有13章和三个附录,涵盖了逆向工程的基础知识、应用、开发和拓展的...
  • 彩虹UDA软件狗工具带硬复制工具

    千次下载 热门讨论 2010-11-23 15:53:11
    开发商可在要加密软件的源码中加入适当的调用语句,对软件狗进行读写操作,以确定对应的软件狗是否存在,从而决定程序是否继续运行。对加入软件狗函数调用的源程序编译后,链接时加上软件狗的模块文件 (OBJ) 即可。
  • 至于说看哪一本,你可以找对应的电子书,挑一个章节试读一下,符合你的胃口就选择这一本继续读下去。 如果你已经有几年的编码经验,又想把代码写好,建议你多挑基本读读,吸收每本书的精华。 计算机网络 学什么? ...
  • 从35个方面对Jmeter从原理到实际演示,一册在手,天下我有 1.性能测试基本概念 1.1.RT -Response time 请求响应时间 从客户端发出请求到得到响应整个时间 一般包括网络响应时间+server响应时间。 用户接受...
  • 对应的书籍资料见: Visual C++ 2010入门经典(第5版) 基本信息 原书名: Ivor Horton's Beginning Visual C++ 2010 原出版社: Wrox 作者: (美)Ivor Horton 译者: 苏正泉 李文娟 出版社:清华大学出版社 ISBN:...
  • AD7606 具有宽动态范围,是捕获欠压/欠流和过压/过流状况理想器件。输入电压范围可以通过引脚 编程设置为±5 V 或±10 V。 此电路笔记详细介绍针对采用多个 AD7606 器件应用而推荐印刷电路板(PCB)布局。该布局在...
  • (55) 在设计程序时,应采纳的原则之一是(A) 注:和设计风格有关 A. 程序结构应有助于读者理解 B. 不限制goto语句的使用 C. 减少或取消注解行 D. 程序越短越好 (56) 下列不属于软件调试技术的是(B) 注:P98 A. 强行...
  • 代码语法错误分析工具pclint8.0

    热门讨论 2010-06-29 07:00:09
    文件里,否则就无法进行错误信息和程序自动对应了。 为了使用方便,你还可以配置一下Menu按钮,将它加到系统菜0单里,这属于一般性 Source Insight应用,笔者就不在此赘述了。 第二笔者在NT中使用Source ...
  • 本书配光盘,书中实例源程序和相关资料可在对应章节文件夹中找到。 本书是从事串口及网络通信技术人员和学习者极佳参考资料,也可以作为数据通信课程辅助教材。 作者简介 龚建伟,工学博士,目前在北京...
  • 12.1.2 释放资源的原则 245 12.1.3 访问资源的原则 246 12.1.4 何时释放资源 246 12.2 颜色(Color) 247 12.2.1 系统颜色 248 12.2.2 RGB颜色 249 12.3 字体(Font) 250 12.4 光标(Cursor) 251 ...
  • 12.1.2 释放资源的原则 245 12.1.3 访问资源的原则 246 12.1.4 何时释放资源 246 12.2 颜色(Color) 247 12.2.1 系统颜色 248 12.2.2 RGB颜色 249 12.3 字体(Font) 250 12.4 光标(Cursor) 251 ...
  • 2020年9月19日至9月23日,可以在研招网咨询对应学校老师. 1.6.1.2. 预报名 2020年9月24日至9月27日,每天9:00~22:00 报名时备用信息无明确要求 1.6.1.3. 网上报名 2020年10月10日至10月31日,每天9:00-22:00 报名...
  • (6) 在先左后右的原则下,根据访问根结点的次序,二*树的遍历可以分为三种:前序遍历、______遍历和后序遍历。 答:中序 (7) 结构化程序设计方法的主要原则可以概括为自顶向下、逐步求精、______和限制使用goto语句...

空空如也

空空如也

1 2
收藏数 38
精华内容 15
关键字:

动态原理对应的原则