一份NicholasWilt推荐的计算机书单。NicholasWilt设计

蚁工厂 2025-11-20 12:35:24

一份Nicholas Wilt 推荐的计算机书单。Nicholas Wilt设计并经常实现了CUDA中所有低级抽象,从第一个版本直到4.0,是知名的软件架构师和性能优化专家.--------------------------------我从 1982 年开始从事专业计算机编程工作。这一路走来,我阅读了大量的书籍、文章(包括学术论文和行业刊物)、博客以及其他资料。外面确实有很多很棒的内容!与此同时,有些内容因其卓越而脱颖而出,让我多年来不得不反复查阅。这份简短的书单反映了我职业生涯中大部分时间都在用户模式(User Mode)下“摆弄比特位”的经历。闲话少叙,排名不分先后,以下是一份我书架上的资源清单。它们对我帮助很大,其中一些甚至陪伴了我数十年。1️⃣教材类《算法导论》第4版 (Introduction to Algorithms, 4th ed.) 作者:Cormen, Leiserson, Rivest 和 Stein这本书现已出到第四版。自 1990 年问世以来,它一直是该领域最好的教材,当时正好赶上我大二的算法课程。自该书首次出版以来,算法设计必然演变为更加以并行架构为中心;而且在今天,内存操作(Memory Operations)的重要性远超指令执行的数量。但是,书中描述的用于证明算法正确性及其性能分析的数学和工具是永恒的。各章节的难度循序渐进,从简单的排序算法和二叉树等数据结构,到动态规划、贪心算法和摊还分析(Amortized Analysis),再到那些只能提供概述并指引读者去查阅其他资源的高级主题。我对此书唯一能挑的刺是:早期的版本有一章关于并行算法的内容,涵盖了 PRAM 模型,这非常适合像 GPU 这样的大规模并行架构;但后来这一章被关于线程(threading)的内容取代了,这可能是由于合著者 Charles Leiserson 对 Cilk 编程语言的偏爱。不过,并行编程是一个如此宏大的话题,本来也就只能给一个带参考文献的介绍性章节。 这本书是一块瑰宝。《编程珠玑》第2版 (Programming Pearls, 2nd ed.) 作者:John Bentley早在 20 世纪 80 年代,卡内基梅隆大学教授 Jon Bentley 为《ACM 通讯》(Communications of the ACM)撰写了一个名为“编程珠玑”的月度专栏,这本书就是这些专栏文章的精选集。当我还是杜克大学的大一新生(约 1988 年)时,这本书是必修的“编程入门”课程的必买书目,尽管据我观察它并没有真正融入课程大纲中。但我立刻就被迷住了:他谈论了从 DSL(尽管他称之为“小语言”)到二叉堆(他简称“堆”)的所有内容。Bentley 对编程技艺显而易见的热爱,加上清晰的解释和平易近人的风格,至今仍激励着我。《算法心得:高效算法的奥秘》第2版 (Hacker’s Delight, 2nd ed.) 作者:Henry S. Warren光看这英文书名(直译为“黑客的愉悦”),谁能抗拒?这是你在任何地方能找到的密度最高的位操作(bit twiddling)秘籍合集。无论你是需要一个无分支的条件取反,还是需要弄清楚如何利用浮点硬件来寻找最高有效位(Most Significant Set Bit),亦或是想理解格雷码(Gray codes),或者为什么整数除法如此该死的困难,这本书都能满足你!它的组织结构很好,但如果你像我一样,可能会在细细研读中迷失自我,然后在需要时再回过头来寻找那些智慧的内核。书中描述的一些技巧已经被硬件吸纳了(他那一系列的种群计数/Popcount 算法在某些平台上已被原生机器指令淘汰),编译器也变得更加智能,使得我们不再需要手动写出某些优化(参见上面的“无分支条件取反”)——这很大程度上是因为编译器编写者在过去几十年里一直在钻研这本书,并想方设法将代码转换为使用这里描述的惯用模式。 顺便说一句,如果你喜欢《算法心得》,那你也得去看看由 Sean Eron Anderson 维护的“斯坦福位操作黑客技巧”(Stanford bit twiddling hacks)。《人月神话》(The Mythical Man-Month) 作者:Fred Brooks这本常被引用的软件工程经典著作值得每隔几年重读一次。如果听到这个书名你的第一反应是:“哦,就是那本发现‘由于沟通开销,将软件工程团队规模扩大一倍会导致进度延误’的书……”——请立刻停下手中的事,如果你还没有这本书,去买一本,然后重读它。每次阅读,我都会被 Brooks 阐述的一些持久真理重新震撼。我在想,我们究竟应该惊讶于软件工程在过去五十年里变化之大,还是惊讶于其变化之小? 读这本书会让你倾向于后者。当 Brooks 写这本书时,还没有人谈论“Scrum”或“敏捷编程”,但他分享的许多关键见解今天仍然适用。他观察到某些软件工程师的生产力大大高于平均水平(高出一两个数量级,我们都见过这种情况),紧接着又指出,根本没有足够多的这类工程师来完成所有需要的工作。他对角色的讨论,从 QA 到软件架构师再到语言律师(language lawyers,他真的用了这个词),在今天依然像当年一样切中肯中。 想起来,我的 Kindle 里有这本书,而且我已经有一段时间没重读了。2️⃣性能辅助资料 (Performance Aides)《内存一致性与缓存一致性入门》(A Primer on Memory Consistency and Cache Coherence) 作者:Vijay Nagarajan, Daniel J. Sorin, Mark D. Hill, 和 David A. Wood当这本中篇小说般大小的论著第一版出版时,John Montrym 把它递给我说:“读。这个。” Montrym 在 90 年代末加入 NVIDIA 之前是一位传奇的 GPU 架构师,他既才华横溢又待人热情慷慨;所以如果他让你读什么东西,你最好放下一切照做。对于任何对并行计算架构感兴趣的人来说,这本杰作都是必读之物,无论是多核 CPU、多插槽服务器、GPU,还是兼具两者的现代服务器。它从定义一致性(Consistency)和连贯性(Coherence)开始,阐述了它们的动机、多年来出现的可扩展性问题以及针对这些问题的解决方案。它包含了对 TSO/x86(英特尔的“完全存储排序”内存一致性模型)的详细描述,这个模型曾经非常深奥,只是缺乏文档的“部落知识”(tribal knowledge),直到 Linux 内核团队考虑优化他们的自旋锁(spin lock)时才被重视。根据该书的描述(附有参考链接): 各路专家就是否需要在将锁变量设为 1 的最终 MOV 指令前加 LOCK 前缀争论不休。直到 Linus Torvalds 说“我知道它是需要的”,讨论才结束。结果一位英特尔架构师终于介入说:“你知道吗,其实,并不需要。” 随之而来的是英特尔发布的一系列手册,记录了 x86 内存模型,且每个版本的精确度都在提高。英特尔实际上还在过程中修改了已发布的规则,撤回了一些优化,因为他们意识到这会破坏现有的软件。这本入门书现在已经是第二版了,增加了一章关于“加速器”(主要是 GPU)的内容。书中包含大量的参考文献,供你深入研究。Intel Intrinsics Guide (英特尔内联函数指南) 作者:Intel Corporation这个资源适合所有想要访问深奥的 x86 指令——尤其是 SIMD 指令——的开发者,除非你是个受虐狂,或者有极其充分的工程理由去绕过编译器自动进行寄存器分配和指令调度的能力。 如今,为 x86 芯片编写 SIMD 代码就像写法律简报:需要大量的研究,部分原因在于指令实现方式中存在令人恼火的“正交性缺失”(orthogonality misses)。你必须确认指令集实际上支持某个特性(例如:在 AVX512 之前,没有 SIMD 的 double-to-int64 转换指令。你一次只能做一个!),并且该特性在指令集的完整 SIMD 宽度上都得到支持。 Intrinsics Guide 允许你按 ISA(指令集架构)过滤,并搜索指令助记符或内联函数名称。一旦找到,它会提供关于指令具体行为的详细信息、哪些英特尔芯片实现了它、需要包含哪个头文件,以及性能指南(以时钟周期为单位的延迟和 CPI——每指令时钟数表示的吞吐量)。Optimization Manuals (优化手册) 作者:Agner Fog如果他的网站能说明什么的话,Agner Fog 是一位多才多艺的“文艺复兴式通才”;但对我来说,他关于 x86 微架构和 x86 指令表的手册简直价比白金。 为了传达这些作品中蕴含的成就规模,请注意微架构手册的版权年份是 1996-2025。(它上次更新是在九月!)执行流水线、微操作缓存(micro-op caches)、指令解码、分支预测、缓存架构、部分寄存器访问、存储转发(store forwarding)……这些只是你可以从这些页面中收集到的 CPU 实现细节的一小部分。3️⃣历史参考资料 (Historical References)The Story of ISPC (ISPC 的故事) 作者:Matt PharrISPC(“隐式 SPMD 程序编译器”)是一个旨在简化 SIMD 指令集编程的工具链:与向量化编译器相比,它在让程序员表达意图与编译器生成相应代码的能力之间取得了更自然的平衡。它的采用率没有我预期的那么高,尽管它已经赢得了一些重要的关注:梦工厂(DreamWorks)开源了他们使用 ISPC 的 MoonRay 渲染器。 计算机图形学的极客们知道 Matt Pharr 是因为他的巨著《基于物理的渲染》(Physically Based Rendering),该书现已出到第四版;但在 ISPC 中,他也创造了唯一一种可行的方法,让人能用可读的语法编写 SIMD 指令集,而无需使用内联函数(intrinsics)。 对我来说,这个博客系列是关于早期 GPU 计算格局(当时 CUDA 还是新鲜事物)的重要历史参考。从 Larrabee(英特尔在 2000 年代后期进入并行计算竞赛的多核产品)的早期历史开始,Pharr 详细介绍了他在向量化编译器技术方面的实验如何导致了我们要现在所知的 ISPC,以及 ISPC 如何被英特尔开源。里面有一些非常有趣的故事。Oral history of Intel (英特尔口述历史) 作者:Bob ColwellBob Colwell 于 1990 年开始在英特尔担任 CPU 架构师,致力于 Pentium Pro 的研发。Pentium Pro 是第一个为 x86 指令集实现 4/1/1 解码器的 CPU,并且大幅改进了 Pentium 有限的超标量特性。他是 Pentium 4 的首席架构师,据报道他在该芯片中包含了 64 位特性,但后来被禁用了。 这份口述历史的篇幅相当于一本中等大小的书。其中涉及安腾(Itanium)的讨论对我来说特别有趣,但内容远不止于此。 无论你对英特尔有何看法,它在历史上的地位是稳固的,而 Colwell 既在书写这段历史中发挥了巨大的作用,也亲眼见证了这里叙述的许多事件。

0 阅读:0
蚁工厂

蚁工厂

感谢大家的关注