此文乃是翻译。。
原文地址:http://mechanical-sympathy.blogspot.com/2011/07/write-combining.html
墙内地址:http://ifeve.com/write-combining/
合并写(write combining )
现代CPU采用大量的技术来抵消内存访问延迟。 从DRAM存储中读取或者写入数据的时间CPU可以执行上百个指令。
用来降低这种延迟的主要手段是使用多层次的SRAM缓存。此外,也有SMP系统采用消息传递协议来实现缓存之间的一致性。即便如此,现代CPU是如此之快,是缓存根本无法企及的。因此,为了进一步降低延迟一些鲜为人知的缓冲区(buffers )也被使用。
本文探讨“合并写存储缓冲区(write combining store buffers)”,以及我们如何编写代码可以有效地使用它们。
CPU缓存是一个高效的非链式结构的hash map,每个桶(bucket)通常是64个字节。被称为之为一个“缓存行(cache line)”。缓存行(cache line)是内存传输的有效单元。例如,主存中地址A会映射到一个给定的缓存行C。
如果CPU需要访问的地址hash之后并不在缓存行(cache line)中,那么缓存中对应位置的缓存行(cache line)会失效,以便让新的值可以取代该位置的现有值。例如,如果我们有两个地址,通过hash算法hash到同一缓存行,那么新的值会覆盖老的值。
当CPU执行存储指令(store)时,它会尝试将数据写到离CPU最近的L1缓存。如果这时出现缓存失效,CPU会访问下一级缓存。这时无论是英特尔还是许多其他厂商的CPU都会使用被称为“合并写(write combining)”的技术。
当请求L2缓存行的所有权的时候,最典型的是将处理器的store buffers中某一项写入内存的期间, 在缓存子系统( cache sub-system)准备好接收、处理的数据的期间,CPU可以继续处理其他指令。当数据不在任何缓存层中缓存时,将获得最大的优势。
当连串的写操作需要修改相同的缓存行时,会变得非常有趣。在修改提交到L2缓存之前,这连串的写操作会首先合并到缓冲区(buffer)。 这些64字节的缓冲(buffers )维护在一个64位的区域中,每一个字节(byte)对应一个位(bit),当缓冲区被传输到外缓存后,标志缓存是否有效。
也许你要问如果程序要读取一些已被写入缓冲区(buffer)的数据,会发生什么事呢?我们的硬件会友好的处理,它们在读取缓存之前会先读取缓冲区。
这一切对我们的程序意味着什么呢?
如果我们可以在缓冲区被传输到外缓存之前能够填补这些缓冲区(buffers ),那么我们将大大提高传输总线的效率。如何才能做到这一点呢?大部分程序花费其大部分时间在循环的处理某项任务。
由于这些缓冲区的数量是有限的,并且它们根据CPU的型号有所不同。例如在Intel CPU,你只能保证在同一时间拿到4个。这意味着,在一个循环中,你不应该同时写超过4个截然不同的内存位置,否则你讲不能从合并写(write combining)的中受益。
代码如下:
public final class WriteCombining { private static final int ITERATIONS = Integer.MAX_VALUE; private static final int ITEMS = 1 << 24; private static final int MASK = ITEMS - 1; private static final byte[] arrayA = new byte[ITEMS]; private static final byte[] arrayB = new byte[ITEMS]; private static final byte[] arrayC = new byte[ITEMS]; private static final byte[] arrayD = new byte[ITEMS]; private static final byte[] arrayE = new byte[ITEMS]; private static final byte[] arrayF = new byte[ITEMS]; public static void main(final String[] args) { for (int i = 1; i <= 3; i++) { out.println(i + " SingleLoop duration (ns) = " + runCaseOne()); out.println(i + " SplitLoop duration (ns) = " + runCaseTwo()); } int result = arrayA[1] + arrayB[2] + arrayC[3] + arrayD[4] + arrayE[5] + arrayF[6]; out.println("result = " + result); } public static long runCaseOne() { long start = System.nanoTime(); int i = ITERATIONS; while (--i != 0) { int slot = i & MASK; byte b = (byte) i; arrayA[slot] = b; arrayB[slot] = b; arrayC[slot] = b; arrayD[slot] = b; arrayE[slot] = b; arrayF[slot] = b; } return System.nanoTime() - start; } public static long runCaseTwo() { long start = System.nanoTime(); int i = ITERATIONS; while (--i != 0) { int slot = i & MASK; byte b = (byte) i; arrayA[slot] = b; arrayB[slot] = b; arrayC[slot] = b; } i = ITERATIONS; while (--i != 0) { int slot = i & MASK; byte b = (byte) i; arrayD[slot] = b; arrayE[slot] = b; arrayF[slot] = b; } return System.nanoTime() - start; } }
这个程序在我的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个数组位置(对应6个内存地址),我们的程序运行时间明显长于拆分工作的方式,即是:先写前3个位置,后修改后3个位置的数据。
通过拆分循环,我们可以让程序用更少的时间完成更多的工作!欢迎来到神奇的“合并写(write combining)”。通过使用CPU架构的知识,正确的填充这些缓冲区,我们可以利用底层硬件加速我们的程序。
不要忘了超线程(hyper-threading),可能有2个逻辑线程在竞争同一个核的缓冲区。
相关推荐
- sympathy: 同情 - favour: 喜爱,恩惠 - accompany: 陪伴,伴奏 - declare: 宣布,声明 5. 构词法: - satisfy + action → satisfaction: 满足,满意 - over + weight → overweight: 超重的 - finger + ...
【标题】:“冲突管理学习笔记” 这篇学习笔记主要聚焦于在软件开发过程中常见的...而“Mechanical Sympathy Java Garbage Collection Distilled”这篇文档则为读者提供了深入理解Java内存管理和性能调优的宝贵资源。
1. 英语短语翻译: - 考验:put to the test - 不管,别惹,让…一个人待着:leave sb. alone - 同情某人:feel sympathy for sb. - 转向,回转:turn around - 打电话给:call sb. - 将…放在一边,为…保留/...
知识目标要求学生掌握重点单词如wealth、sympathy、daughter-in-law、fill with、jump in out of,以及句型如"Why don’t we…"和由what引导的名词性从句,以及虚拟语气的用法。情感目标旨在激发学生对英语学习的...
22. **sympathy** - 同情 接着,我们分析了单元中的主要短语: 1. **对...有益** - be beneficial to/ do good to; **从...中受益** - benefit from 2. **适应...** - adapt to/adjust to/get used to 3. **一个...
8. -script- = -scrib-:写;例如:script(脚本)、describe(描述) 9. -techn(o)-:技术、艺术;例如:technique(技术)、technology(技术) 10. -press-:压、按;例如:press(压)、impress(印象) 11. ...
- **sympathy** (同情): 当某人假装生病时,可能是希望得到他人的同情(sympathy)。 - **accompanied** (伴奏): 在句子中,表示昨晚有人用钢琴为说话者伴奏。 - **to declare** (宣布): 宣布比赛开始的人通常是...
2. 同情(Sympathy): - "Oh, I’m sorry!" 对不幸情况的基本反应。 - "What a shame!" 或 "What a pity!" 表达遗憾。 - "That’s terrible!" 对糟糕情况的反应。 - "I’m sorry to hear that!" 听到不好的消息...
15. **sympathy** - 同情:对他人痛苦或困难的共鸣和理解。 16. **pile** - 堆积物:一堆物品堆积在一起。 17. **framework** - 框架:结构或基础,常用于构建或支持其他事物。 18. **overweight** - 超重:体重...
- **as a series of**:作为一系列 - **ahead of**:在……之前 - **all the time**:一直,始终 - **at first sight**:乍一看 - **at present**:目前 - **at this rate**:照这样下去 - **at times**:有时 - **...
- sympathy:名词,意为“同情”,表达对他人的处理方式的理解或共鸣。 2. 句型转换: - On average, 表示“平均来说”,与原句意义相同。 - show high respect for:与原句中的“show respect for”同义,表示...
- **sympathy**:同情,如“当我看到那些饥饿的孩子时,不免对他们产生同情。” - **have a talent for**:在某方面有天赋,如“她有音乐天赋。” 8. **固定搭配**: - **no choice other than**:别无选择,如...
6. have sympathy for - 同情,经常同情别人的人会得到帮助。 7. or rather - 更准确地说,实际上他昨晚很晚回家,或者说是在今天凌晨。 8. set aside - 留出,她每个月留出一点钱。 9. turning around - 转身,有些...
【大学英语六级翻译】是针对中国大学生的一项高级英语能力测试,旨在评估学生的英语综合运用能力,特别是阅读、写作、听力和翻译技能。这个练习题目是关于“生活”的主题,这也是六级考试中常见的题材,因为其能反映...
74. sympathy - 同情;怜悯 75. 体重超常的 - overweight 76. 优雅的高雅的 - elegant 77. in favour of - 支持;赞成 78. 章节 - chapter 这个词汇表涵盖了高中英语选修七课本中的关键单词和短语,包括各个主题,...
- `sympathy`:同情(心) - `favour`:喜爱,恩惠;vt. 喜爱,偏袒 - `accompany`:陪伴,伴奏 - `affair`:事务,事情 - `declare`:宣布,声明,表明,宣称 - `envy`:忌妒,羡慕 - `talent`:天才,才干...
3. 同情(心)- sympathy 4. 喜爱,恩惠 - favor 5. 宣布,表明 - announce 6. 全体员工,手杖 - staff 7. 较年幼的,地位较低的 - junior 8. 离婚,断绝关系 - divorce 9. 天才,特殊能力 - talent 10. 评价,评定 ...
(5) sympathy -> sympathy (同情) (6) fright -> fright (惊恐) (7) service -> service (服务) (8) solution -> solution (解决) (9) glimpse -> glimpse (一瞥) (10) surrender -> surrender (投降) (11) ...
通过结合课文查找中文翻译、联想相关用法,并通过单选题练习来巩固词汇的用法,是提高英语水平的有效方法。在学习过程中,学生应持续练习,不断积累,以点带面,最终全面掌握这些知识,为日后的学习和交流打下坚实...
3. 含有`ad-`的一系列前缀,如`admirable`(令人敬佩的),表示加强或方向。 4. `amphi-`表示双重或对立,如`amphibian`(两栖动物)。 5. `an-`在词根前表示否定,如`anarchy`(无政府状态)。 6. `ana-`涉及错误或...