
3.3.10 《并行编程很难么》
文章平均质量分 90
https://download.youkuaiyun.com/download/u012906122/89474795
hyh-hz
书是越读越薄的
展开
-
Chapter 18 Looking Forward and Back
序列公司意识到,它能够迅速培训新工程师掌握并行计算的奥秘是不同寻常的,因此出版了一本精简的书籍,凝聚了公司的并行编程智慧[Seq88],这与几年前发表的两篇开创性论文[BK85,Inm85]相辅相成。保罗开始提问时指出,在1991年至2006年的15年间,一个并行系统的成本已经从一栋房子的价格降到了一辆中档自行车的价格,显然在未来15年内,直到2021年,还有很大的降价空间。因此,他发表了一段简短的、不置可否的讲话。对于编辑和撰稿人来说,这是第二版的终点,但对于那些愿意加入的人来说,这也是第三版的起点。翻译 2025-04-05 17:17:05 · 37 阅读 · 0 评论 -
Chapter 17 Conflicting Visions of the Future
预测是非常困难的,尤其是关于未来的。尼尔斯·玻尔本章呈现了一些关于并行编程未来的相互冲突的愿景。这些愿景中哪一个会成为现实尚不清楚,事实上,甚至不清楚它们是否会实现。然而,这些愿景都很重要,因为每个愿景都有其忠实的支持者,如果足够多的人对某件事深信不疑,你将不得不面对它对其支持者的思想、言语和行为产生的影响。此外,一个或多个这样的愿景最终将会实现。但大多数都是虚假的。分辨出哪些是哪些,你就会变得富有[Spi77]!因此,以下章节将概述事务内存、硬件事务内存、回归测试中的形式验证以及并行函数编程。但首先,我们翻译 2025-04-05 14:27:45 · 59 阅读 · 0 评论 -
Chapter 16 Ease of Use
同样地,对于线程1来说,要被阻塞,其他线程必须已经获取了元素2的锁,依此类推,直到线程N - 1,它获取了元素N - 1的锁。简而言之,如果你正在开发一个旨在帮助你完全不了解的人的软件项目,当这些人对你的项目提出批评时,你不必感到惊讶。两种传统的方法是按地址顺序获取锁,或者按照列表中出现的顺序获取锁,这样当头部作为被锁定的两个元素之一时,总是先获取头部的锁。17.明显的用法是错误的。要实现这一点,从零开始给列表中的元素编号,起始为表头,结束于列表最后一个元素(即表头前的一个元素,因为列表是循环的)。翻译 2025-04-05 13:42:41 · 14 阅读 · 0 评论 -
Chapter 15 Advanced Synchronization:Memory Ordering
进步的艺术是在变化中保持秩序,在秩序中保持变化。怀德海因果关系和排序是非常直观的,黑客通常对这些概念有很强的把握。这些直觉在编写、分析和调试顺序代码时不仅非常有用,而且在使用诸如锁定等标准互斥机制的并行代码时也非常有用。不幸的是,这些直觉在代码中完全崩溃,而是使用弱有序的原子操作和内存障碍。这类代码的一个示例实现了标准互斥机制,而另一个示例实现了使用较弱同步的快速路径。尽管侮辱了直觉,但有些人认为弱点是一种美德。美德或缺点,这一章将帮助您理解内存顺序,通过实践,这将足以实现同步原语和性能关键的快速路径。第1翻译 2025-03-31 00:44:00 · 19 阅读 · 0 评论 -
Chapter 14 Advanced Synchronization
如果一点知识是一件危险的事情,想想你可以用大量的知识做些什么吧!未知的本章介绍了用于无锁算法和并行实时系统的同步技术。尽管无锁算法在面对极端要求时可以非常有用,但它们并不是灵丹妙药。例如,如第5章末尾所指出的,在考虑无锁算法之前,您应该彻底应用分区、批处理和经过良好测试的打包弱api(参见第8章和第9章)。但在完成所有这些之后,您仍然会发现自己需要本章中描述的高级技术。为此,第14.1节总结了迄今为止用于避免锁的技术,而第14.2节给出了非阻塞同步的简要概述。内存排序也很重要,但它保证了自己的章节,即第15翻译 2025-03-16 22:42:42 · 26 阅读 · 0 评论 -
Chapter 13 Putting It All Together
你不学习如何射击,然后学习如何发射,然后学习做一个受控制的旋转——你学习发射-射击-旋转。安德的影子,奥森斯科特卡本章对并发编程谜题提供了一些提示。第13.1节考虑了反难题,Section13.2refurbishes参考计数,第13.3节有助于处理危险指针,第13.4节对序列锁定特性的推测,最后第13.5节反映了RCU救援。13.1反难题福特继续静静地数着数。这是你能对电脑做的最具攻击性的事情,相当于去对一个人说“血……血液……血液……血液……”道格拉斯亚当斯本节概述了解决难题的解决方案。13.1.1计数翻译 2025-03-09 21:16:08 · 34 阅读 · 0 评论 -
Chapter 12 Formal Verification
注意上面代码中的错误;我只证明了它是正确的,而没有尝试过。唐纳德克努斯并行算法可能很难编写,甚至更难进行调试。测试虽然是必要的,但却是不够的,因为致命的种族条件发生的概率极低。正确性的证明是有价值的,但最终会和原始算法一样容易出现人为错误。此外,不能期望一个正确性的证明会发现您的假设中的错误、需求中的缺陷、对底层软件或硬件原语的误解,或者您认为没有为其构建证明的错误。这意味着正式的方法永远不能取代测试。然而,形式化方法可以是验证工具箱中的一个有价值的补充。有一个工具可以以某种方式定位所有种族条件。存在许多这翻译 2025-03-09 20:45:07 · 1418 阅读 · 0 评论 -
Chapter 11 Validation
如果没有测试,就行工作。未知的我第一次有一些并行程序可以工作,但那只是因为我在过去的几十年里写了大量的并行程序。我有更多的并行程序愚弄了我,认为它们第一次就工作正常,而不是第一次就实际工作。因此,我需要验证我的并行程序。验证背后的基本技巧是意识到计算机知道什么出了问题。因此,你的工作就是强迫它告诉你。因此,这一章可以被认为是机器审讯的一个短程。但是你可以把好警察和坏警察的习惯留在家里。这一章涵盖了更复杂和更有效的方法,特别是考虑到大多数计算机都不能区分一个好警察和一个坏警察,至少据我们所知是这样。在许多最近翻译 2025-03-02 22:16:31 · 51 阅读 · 0 评论 -
Chapter 10 Data Structures
坏的程序员担心代码。好的程序员担心数据结构及其关系。拉纳斯托瓦尔兹对算法的认真讨论包括其数据结构的时间复杂度[CLRS01]。然而,对于并行程序,时间复杂度包括并发效应,因为这些影响可能会非常大,如第3章所示。换句话说,一个好的程序员的数据结构关系包括那些与并发性相关的方面。本章将揭示一些复杂的问题:1.然而,完全按照第6章中给出的良好建议设计的数据结构可能在某些类型的系统上完全无法扩展。2.完全按照第6章和第9章中给出的良好建议设计的数据结构仍然可能无法在某些类型的系统上进行扩展。3.即使是只读的无同步数翻译 2025-02-26 00:48:23 · 18 阅读 · 0 评论 -
Chapter 9 Deferred Processing
苍天不负有心人。紫罗兰推迟工作的策略可以追溯到有记录的历史出现之前。它偶尔会被嘲笑为拖延症,甚至纯粹是懒惰。然而,在过去的几十年里,工人们已经认识到这种策略在简化和简化并行算法方面的价值[KL80,Mas92]。信不信由你,并行编程中的“懒惰”往往优于和优于勤奋!这些性能和可伸缩性的好处源于延迟工作可以削弱同步原语,从而减少同步开销。那些愿意并能够阅读和理解这一章的人将会揭开许多谜团,包括:1.等待并发代码的粗心开发人员使用的引用计数陷阱。2.一个并发引用计数器,它不仅避免了这种陷阱,而且还避免了昂贵的原子翻译 2025-02-23 22:06:48 · 80 阅读 · 0 评论 -
Chapter 8 Data Ownership
避免锁定带来的同步开销最简单的方法之一是将数据分配给各个线程(或在内核的情况下,分配给各个CPU),使得每条数据仅由一个线程访问和修改。有趣的是,数据所有权涵盖了“三大”并行设计技术:它在不同线程(或CPU)之间进行划分,批量处理所有本地操作,并且将同步操作的消除推向了逻辑上的极致。因此,数据所有权被广泛使用也就不足为奇了:即使是初学者也会几乎本能地使用它。事实上,它的使用如此频繁,以至于本章不会介绍任何新的例子,而是会回顾前几章的内容。翻译 2025-02-16 23:33:58 · 32 阅读 · 0 评论 -
Chapter 7 Locking
锁定是最糟糕的通用方法 同步机制,但不包括所有这些 其他机制也时不时地被尝试过。 向温斯顿·丘吉尔的遗体和他所引用的任何人致歉 在最近的并发研究中,锁定常常扮演着反派的角色。锁定被指责引发死锁、队列问题、饥饿、不公平、数据竞争以及各种其他并发罪行。有趣的是,在生产级共享内存并行软件中,锁定同样扮演着生产工具的角色。本章将探讨这种反派与英雄之间的二元对立,如图7.1所示。和7.2。 这种两面性背后有很多原因: 1.锁定的许多缺点都有实用的设计解决方案,在大多数情况下都行得通,例如:翻译 2025-02-10 00:00:48 · 33 阅读 · 0 评论 -
Chapter 6 Partitioning and Synchronization Design
分而治之。马其顿的菲利普二世 本章介绍如何利用现代商品化的多核系统的优势,通过使用惯用法或“设计模式”[Ale79,GHJV95,SSRB00]来平衡性能、可扩展性和响应时间。正确划分的问题可以产生简单、可扩展且高性能的解决方案,而划分不当的问题则会导致缓慢且复杂的解决方案。本章将帮助你设计分区方法。 将这些内容融入你的代码中,同时讨论批处理和弱化的问题。“设计”这个词非常重要:你应该先进行分区,然后是批处理,接着是弱化,最后才是编码。改变这个顺序通常会导致性能和可扩展性下降,还会带来极大的挫败感。翻译 2025-02-09 21:08:59 · 29 阅读 · 0 评论 -
Chapter 5 Counting
简单如1、2、3! 未知的计数或许是计算机最简单、最自然的功能。然而,在大型共享内存多处理器上高效且可扩展地进行计数却颇具挑战。此外,计数这一概念的简洁性使我们能够探索并发的基本问题,而无需受复杂数据结构或同步原语的干扰。因此,计数为并行编程提供了一个极好的入门。 本章介绍了一些具有简单、快速和可扩展计数算法的特殊案例。但是首先,让我们了解您对并发计数已经了解了多少。 清单5.1:仅仅计数! 1未签名的长计数器=0;2 3静态__inlin翻译 2025-02-06 22:42:51 · 67 阅读 · 0 评论 -
Chapter 4 Tools of the Trade
你的好坏取决于你的工具,而你的工具的好坏也取决于你。 未知的本章简要介绍了并行编程的一些基本工具,主要关注运行在类似于Linux的操作系统上的用户应用程序可用的那些工具。第4.1节从脚本语言开始,第4.2节描述了POSIX API支持的多进程并行性以及对POSIX线程的讨论,参见第4.3节在其他环境中呈现模拟操作,最后,第4.4节帮助选择完成工作的工具。 请注意,本章仅提供简要介绍。更多细节可参见参考文献(和因特网),并在后续章节中提供更多信息。 4.1脚本语言至高无上的美德是简单。 亨利·沃翻译 2025-02-04 23:38:29 · 45 阅读 · 0 评论 -
Chapter 3 Hardware and its Habits
过早抽象是一切罪恶的根源。 成千上万的人大多数人直觉地认为,在系统之间传递消息比在一个系统内部执行简单的计算要昂贵得多。但同样,单共享内存系统中线程之间的通信也可能非常昂贵。因此,本章探讨了在共享内存系统中同步和通信的成本。这几页内容最多只能触及共享内存并行硬件设计的表面;希望了解更多细节的读者最好从亨尼斯和帕特森的经典著作的最新版本开始阅读[HP17,HP95]。 3.1概述机械同感:硬件和软件协同工作。 马丁·汤普森对计算机系统规格表的粗心阅读可能会让人相信CPU性能是翻译 2025-02-04 21:45:54 · 33 阅读 · 0 评论 -
Chapter 2 Introduction
首先,在过去的几十年里,由于摩尔定律的影响,多核系统的成本已经从房屋价格的数倍降到了一顿普通餐食的价格[Mo65]。如今,编程不再需要手动操作键盘。需要注意的是,并行编程的难度既是一个人为因素问题,也是一个并行编程问题的技术属性。因此,我们可以预期围绕并行系统的发明和创新水平将大幅提高,随着时间的推移,这种日益增长的熟悉度将使曾经昂贵得令人望而却步的并行编程领域变得更加友好和平凡。那些仍然坚持认为并行编程不可能实现的人,应该回顾一些较早的并行编程指南[Seq88,Bir 89,BK 85,Inm 85]。翻译 2025-02-04 19:10:59 · 32 阅读 · 0 评论 -
Chapter 1 How To Use This Book
对于从Linux内核角度介绍内存排序的教程,保罗·邦齐尼的LWN系列是一个很好的起点[Bon21a,Bon21e,Bon21c,Bon21b,Bon21d,Bon21f]。因此,那些在查看答案前真正努力解答问题的读者会发现,他们的付出得到了丰厚的回报,对并行编程的理解也得到了显著提升。(b)本贡献基于先前的工作,据我所知,该工作受适当的开源许可保护,我有权根据该许可提交修改后的作品,无论这些修改是全部或部分由我完成的,均需遵循相同的开源许可(除非我被允许以其他许可提交),具体如文件所示;翻译 2025-02-04 11:42:05 · 120 阅读 · 0 评论