linux编程的108种奇淫巧计-15(减少复制)[续]

原创 2011年01月20日 14:49:00

接上文:linux编程的108种奇淫巧计-15(减少复制)

 

     上回提到了用movntdq指令写xmm寄存器的方式,可以获得性能上的收益,并且指出在默认的情况下,在发生写入的时候,需要先从低层次存储层次refill到高层次存储层次(可以简单认为从内存refill进cache),然后再cache中更新,再write back,特别强调的是,这是默认的方式。

     实际上,高一级存储层次,向低一级存储层次写入有两种方式,一种是默认的write back,一种是write through。而我们使用的movntdq指令就是write through方式,必须通过汇编的方式来实现,高级语言通常没有这个效果。怎么理解write back和write through的区别呢?

     对于write back,因为我们知道机器存储层次分为多层,为了保证一致性,必须每一层相同的数据都是一致的,不可能分秒都是一致的,但是在不影响计算逻辑的前提下,需要有一致性的保证,那么write back方式在写的时候有两种情况:A)当写入的地址恰好在cache的某条cache line中,那么直接在cache中写入数据,并且标记该cache line为dirty,此后不发生对内存实际地址的写回,直到发生cache被替换策略时,才将dirty的这条cache line写入到内存中。B)当写入的地址恰好不在cache中(任何一条cache line都不match),首先需要执行一次refill操作,将内存中的数据读入到cache line中,然后将数据写入该cache line,此后不发生对内存地址的写回,直到发生cache被替换策略时,才将dirty的这条cache lien写入内存。

     举个例子:

     某个程序需要执行这样几条命令,按顺序如下:

    (1)在地址0x00FFFF00处写入64个字节的数据[PENNYLIANG...]

    (2)其他命令(64个字节保持在cache中,没有被替换掉)

    (3)读取0x00FFFF00处的64个字节的数据

     (4) 某条命令(该命令将[PENNYLIANG...]这段数据换出了cache(L1 cache只有32k,必然会有被换出的可能)

    (5)读取0x00FFFF00处的64个字节的数据

     (6) 某条命令(该命令将[PENNYLIANG...]这段数据又一次换出了cache

     (7) 在地址0x00FFFF00处写入64个字节的数据[奇淫巧计...]

     (8) 某条命令(该命令将[奇淫巧计...]这段数据又一次换出了cache

 

     从此前介绍的内容,我们不难得到这样几个结论:

     1)在命令(4)之前,写入的数据总是保持在cache中,命令3从cache中读取的[PENNYLIANG...]

     2) 命令(4)导致了cache中数据和内存的一次同步

     3) 命令(5)发生了一次cache read miss,需要从内存中refill[PENNYLIANG...]到cache中。

     4)命令(7)发生了一次cache write miss,需要两次内存访问实现写入,第一次refill,另一次在指令(8)时write back。

  

     不难得到,write back在程序局部性好的情况下,是非常有利的,只要cache 命中了,就可以只在cache中转,而不发生写回,比如指令(3)就直接在cache中得到,如果对这个数据多次写,那么直接在cache中发生,根本不会每次写都体现在内存上。

 

     在理解了write back后,就很容易理解write through了,write through直接从cache写穿到内存,只有单向的过程,没有内存到cache的refill,相当于减少了低层存储层次数据向高层存储层次的复制过程,在大规模数据写入的时候才能体现威力。

    

     我们这里举得例子是cache,或者说L1 cache和内存的关系,广义上看是高层次存储结构和低层次存储结构的关系,内存和磁盘也可以构成这样一个write back和write through的情况,可以看到在小数据量的情况下write back总是最好的,而当发生大量数据写入时write through的方式会更有优势,以后我们会给出这个例子。

 

     参考阅读:

     http://www-903.ibm.com/kr/techinfo/xseries/download/write_back_vs_write_through.pdf

     http://en.wikipedia.org/wiki/CPU_cache

 

 

     

    

      

    

相关文章推荐

linux编程的108种奇淫巧计-15(减少复制)

计算机的存储结构是层次性的,从快到慢,代价从高到低,容量从小到大,寄存器,L1 cache,L2 cache,直到磁盘,甚至比磁盘更慢速的磁带机,因此在程序运行时,不可避免的会有复制,这一点很重要,从...

linux编程的108种奇淫巧计-11(乱序)【续】

用了支持SSE4的CPU,intel core i3,因为支持了palignr指令,所以把上文的代码改用了palignr指令重写了一下如下: 可能由于在虚拟机上运行的原因,性能提升并不显著。 ...

linux编程的108种奇淫巧计-16(如何达到内存最大带宽,复杂指令)

内存的使用可以说对程序员来说极其重要,特别在大规模数据处理中,如何达到内存带宽的极限是程序员追求的目标。    从本节开始,通过一系列的例子,来进行探讨。本系列全部采用汇编语言,使用的例子只有一个就...

linux编程的108种奇淫巧计-4(编译展开)

今天继续介绍第4种常见技巧,编译展开,代码见本文最后,重要的部分有注释说明。 我们知道对于循环,编译器会自动进行展开,但是如何展开,这完全不可控,如果我们自行码代码,代码会显得臃肿难看,大段...

linux编程奇淫巧计17(如何达到内存最大带宽,精简指令,预取和NT)

linux编程奇淫巧计17(如何达到内存最大带宽,精简指令,预取和NT)

CSS布局奇淫巧计之-强大的负边距

css中的负边距(negative margin)是布局中的一个常用技巧,只要运用得合理常常会有意想不到的效果。很多特殊的css布局方法都依赖于负边距,所以掌握它的用法对于前端的同学来说,那是必须的。...
  • cnh42
  • cnh42
  • 2015年02月14日 16:08
  • 77

CSS布局奇淫巧计之-强大的负边距

转自:http://www.cnblogs.com/2050/archive/2012/08/13/2636467.html css中的负边距(negative margin)是布局中的一个常用...

[html5入门-27]CSS布局奇淫巧计之-强大的负边距

来源:点击打开链接 css中的负边距(negative margin)是布局中的一个常用技巧,只要运用得合理常常会有意想不到的效果。很多特殊的css布局方法都依赖于负边距,所以掌握它的用法对于前端的同...

LINUX系统分析与高级编程技术15

  • 2009年03月25日 10:51
  • 684KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux编程的108种奇淫巧计-15(减少复制)[续]
举报原因:
原因补充:

(最多只允许输入30个字)