`
jimmee
  • 浏览: 539991 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

5.合并写(write combining)[转载]

阅读更多

原文地址 译者:无叶 校对:丁一

现代CPU采用了大量的技术来抵消内存访问带来的延迟。读写内存数据期间,CPU能执行成百上千条指令。

多级SRAM缓存是减小这种延迟带来的影响的主要手段。此外,SMP系统采用消息传递协议来实现缓存之间的一致性。遗憾的是,现代的CPU实在是太快了,即使是使用了缓存,有时也无法跟上CPU的速度。因此,为了进一步减小延迟的影响,一些鲜为人知的缓冲区派上了用场。

本文将探讨“合并写存储缓冲区(write combining store buffers)”,以及如何写出有效利用它们的代码。

CPU缓存是一种高效的非链式结构的hash map,每个桶(bucket)通常是64个字节。这就是一个“缓存行(cache line)”。缓存行是内存交换的实际单位。例如,主存中地址A会映射到一个给定的缓存行C。

 

如果CPU需要访问的地址hash后的行尚不在缓存中,那么缓存中对应位置的缓存行会被清除,以便载入新的行。例如,如果我们有两个地址,通过hash算法hash到同一缓存行,那么新的值会覆盖老的值。

当CPU执行存储指令(store)时,它会尝试将数据写到离CPU最近的L1缓存。如果此时出现缓存未命中,CPU会访问下一级缓存。此时,无论是英特尔还是许多其它厂商的CPU都会使用一种称为“合并写(write combining)”的技术。

在请求L2缓存行的所有权尚未完成时,待存储的数据被写到处理器自身的众多跟缓存行一样大小的存储缓冲区之一。这些芯片上的缓冲区允许CPU在缓存子系统准备好接收和处理数据时继续执行指令。当数据不在任何其它级别的缓存中时,将获得最大的优势。

当后续的写操作需要修改相同的缓存行时,这些缓冲区变得非常有趣。在将后续的写操作提交到L2缓存之前,可以进行缓冲区写合并。 这些64字节的缓冲区维护了一个64位的字段,每更新一个字节就会设置对应的位,来表示将缓冲区交换到外部缓存时哪些数据是有效的。

也许你要问,如果程序要读取已被写入缓冲区的某些数据,会怎么样?我们的硬件工程师已经考虑到了这点,在读取缓存之前会先去读取缓冲区的。

这一切对我们的程序意味着什么?

如果我们能在缓冲区被传输到外部缓存之前将其填满,那么将大大提高各级传输总线的效率。如何才能做到这一点呢?好的程序将大部分时间花在循环处理任务上。

这些缓冲区的数量是有限的,且随CPU模型而异。例如在Intel CPU中,同一时刻只能拿到4个。这意味着,在一个循环中,你不应该同时写超过4个不同的内存位置,否则你将不能享受到合并写(write combining)的好处。

代码如下:

01 public final class WriteCombining {
02  
03     private static final int    ITERATIONS = Integer.MAX_VALUE;
04     private static final int    ITEMS      = 1 << 24;
05     private static final int    MASK       = ITEMS - 1;
06  
07     private static final byte[] arrayA     = new byte[ITEMS];
08     private static final byte[] arrayB     = new byte[ITEMS];
09     private static final byte[] arrayC     = new byte[ITEMS];
10     private static final byte[] arrayD     = new byte[ITEMS];
11     private static final byte[] arrayE     = new byte[ITEMS];
12     private static final byte[] arrayF     = new byte[ITEMS];
13  
14     public static void main(final String[] args) {
15         for (int i = 1; i <= 3; i++) {
16             out.println(i + " SingleLoop duration (ns) = " + runCaseOne());
17             out.println(i + " SplitLoop duration (ns) = " + runCaseTwo());
18         }
19         int result = arrayA[1] + arrayB[2] + arrayC[3] + arrayD[4] + arrayE[5] + arrayF[6];
20         out.println("result = " + result);
21     }
22  
23     public static long runCaseOne() {
24         long start = System.nanoTime();
25         int i = ITERATIONS;
26  
27         while (--i != 0) {
28             int slot = i & MASK;
29             byte b = (byte) i;
30             arrayA[slot] = b;
31             arrayB[slot] = b;
32             arrayC[slot] = b;
33             arrayD[slot] = b;
34             arrayE[slot] = b;
35             arrayF[slot] = b;
36         }
37         return System.nanoTime() - start;
38     }
39  
40     public static long runCaseTwo() {
41         long start = System.nanoTime();
42         int i = ITERATIONS;
43         while (--i != 0) {
44             int slot = i & MASK;
45             byte b = (byte) i;
46             arrayA[slot] = b;
47             arrayB[slot] = b;
48             arrayC[slot] = b;
49         }
50         i = ITERATIONS;
51         while (--i != 0) {
52             int slot = i & MASK;
53             byte b = (byte) i;
54             arrayD[slot] = b;
55             arrayE[slot] = b;
56             arrayF[slot] = b;
57         }
58         return System.nanoTime() - start;
59     }
60 }

 

这个程序在我的Windows 7 64位英特尔酷睿i7860@2.8 GHz系统上产生的输出如下:

	1 SingleLoop duration (ns) = 14019753545
 	1 SplitLoop  duration (ns) = 8972368661
 	2 SingleLoop duration (ns) = 14162455066
 	2 SplitLoop  duration (ns) = 8887610558
 	3 SingleLoop duration (ns) = 13800914725
 	3 SplitLoop  duration (ns) = 7271752889

上面的例子说明:如果在一个循环中修改6个数组位置(内存地址),程序的运行时间明显长于将任务拆分的方式,即,先写前3个位置,再修改后3个位置。

通过拆分循环,我们做了更多的工作,但程序花费的时间更少!欢迎利用神奇的“合并写(write combining)”。通过使用CPU架构的知识,正确的填充这些缓冲区,我们可以利用底层硬件加速我们的程序。

不要忘了超线程(hyper-threading),可能会有2个线程竞争同一个核的缓冲区。

分享到:
评论

相关推荐

    sss.zip_selection combining

    在无线通信领域,选择组合(Selection Combining, SC)是一种多天线接收技术,用于提高信号的信噪比(SNR)和系统多样性,从而增强通信系统的可靠性和性能。标题"sss.zip_selection combining"暗示我们将探讨这个...

    diversity.rar_diversity combining

    多样性结合就是利用这些独立衰落的信号副本,通过适当的合并策略,比如选择式合并(Selection Combining, SC)、最大功率合并(Maximal Ratio Combining, MRC)或等增益合并(Equal Gain Combining, EGC),来提高...

    space_coding_SC.rar_selective combining_space

    在这个名为"space_coding_SC.rar_selective_combining_space"的压缩包中,核心内容是实现空间编码与选择性合并(Selective Combining, SC)的MATLAB代码文件“space_coding_SC.m”。通过分析这个文件,我们可以深入...

    MIMO.rar_ mimo combining_diversity matlab_diversity mimo_mimo_

    MIMO with multiuser diversity combining technique

    Combining Pattern Classifiers Methods and Algorithms

    除了理论上的方法外,《Combining Pattern Classifiers Methods and Algorithms》还可能涉及这些组合模式分类器算法的优化与实现。这包括算法效率的提升、减少计算复杂度、避免过拟合等实际问题。书中可能会探讨如何...

    最终程序.zip_Rake接收机_selection combining_最大比值合并_等增益合并_选择合并

    在RAKE接收机中,有三种主要的合并策略:最大比值合并(Maximal Ratio Combining,MRC)、等增益合并(Equal Gain Combining,EGC)和选择合并(Selection Combining,SC)。这些方法各有优缺点,适应不同的通信环境...

    MRC.rar_combining technique_mrc

    此外,它也是分集接收技术的基础,例如最大比合并(Maximal Ratio Combining)和选择式合并(Selection Combining)等。 **优缺点** MRC的优点在于其简单性和有效性,尤其是在高信噪比环境下。然而,它的性能受到...

    教育科研-学习工具-SIMD处理器中写合并和写撤销的处理装置和方法.zip

    SIMD中的“写合并”(Write Combining)是一种优化策略,主要用于减少内存访问的开销。在写合并过程中,处理器会暂时将多个写操作存储在高速缓存或特殊寄存器中,而不立即写入主内存。当这些操作积累到一定数量或者...

    spring-framework-reference4.1.4

    Not Using Commons Logging ................................................................... 12 Using SLF4J ..............................................................................................

    MATLAB.rar_DF MRC_DF combining_最大比合并_解码转发

    程序是使用Matlab仿真协同通信的DF(解码转发)基本性能,基本模型S-R-D三个节点,接收端使用MRC(最大比合并)。固定DF由于SR信道的错误,其性能受到限制,在大SNR情况下不能获得有效分集。而当SR距离足够近的时候...

    几种分集合并方式比较

    1. **选择合并法(Selection Combining, SC)** 选择合并法是最简单的分集合并策略之一。它通过比较各个分集支路的接收信号质量(如信噪比SNR),然后选取其中最佳的一个进行合并。这种方法的优点是实现简单,但可能...

    spring-framework-reference-4.1.2

    Not Using Commons Logging ................................................................... 12 Using SLF4J ..............................................................................................

    MRC.zip_MRC接收分集_MRC最大比合并_softly7jc_分集合并_分集合并技术

    为了解决这个问题,分集技术应运而生,其中最大比合并(Maximum Ratio Combining, MRC)是一种广泛采用的接收端分集方法,尤其在多天线系统中效果显著。本文将深入探讨MRC的基本原理、工作过程以及在瑞利信道下的...

    SAS_Programming_III英文

    5.3 Solutions to Exercises....................................................................................................5-52 Chapter 6 BY-Group Processing and Sorting ..............................

    Springer.The.Developer’s.Guide.to.Debugging.2008.pdf

    1 You Write Software; You have Bugs . . . . . . . . . 1 2 A Systematic Approach to Debugging . . . . . . . 5 2.1 Why Follow a Structured Process? . . . . . . . 5 2.2 Making the Most of Your ...

    瑞利信道下的分集合并技术仿真

    - **等增益合并(Equal Gain Combining, EGC)**:是最简单的分集合并方式,所有接收分支上的信号以相同的权重相加。尽管它不考虑信道状态信息,但仍然能提供一定的性能提升。 - **最大比合并(Maximum Ratio ...

    多线程训练营资料2.xls.md

    合并写(Write Combining) #### 3.1 合并写的概念 合并写是现代CPU提供的一种机制,用于减少内存访问次数。当CPU检测到多次连续写入同一地址时,它会把这些写操作合并起来执行一次,从而提高性能。 #### 3.2 ...

    论文研究-分集合并的性能研究与仿真 .pdf

    论文中提到的三种常见的线性合并分集技术,很可能指的是最大比合并(Maximal Ratio Combining,MRC)、等增益合并(Equal Gain Combining,EGC)以及选择式合并(Selection Combining,SC)。这三种技术各自有不同的...

Global site tag (gtag.js) - Google Analytics