头图

近期书籍推荐

前言

有段时间没有更新博客了,主要是工作切换带来的临时性影响,现在比之前好很多了,趁着有点时间,整理了一下近期书籍推荐.

(大多数书籍我考虑过是否加上“只有英文版本,没有中文版本”作为缺点,但是思考以后我发现“只有英文版本,没有中文版本”不是书籍本身的缺点,是读者本身的缺点,so,所有书籍都删去了这个缺点,有中文版本的书籍会额外注明)

书籍推荐内容主要针对近期(2024年3月)左右的电子书籍,方向主要是C/C++,CUDA编程,SIMD,图像处理等。以下整理的电子书.都是非常经典的技术书籍,再次万分感谢这些书籍的作者,出版社的贡献,推荐大家有能力的话,都去购买正版

C/C++

1.《C++ Core Guidelines Explained: Best Practices for Modern C++》

推荐程度:5x。

推荐范围:初级/中级

这本书主要是对C++ Core GuideLines的说明。原版C++ Core GuideLines就像是佛经或者道德经一样,过于言简意赅,难以广泛地应用到实际开发过程中去。本书则成功将原版书拆解成多个部分,每个部分/每段原则则包含具体的代码样例。这本书的深远程度,不下于《Cpp Primer》。更好的是,该书由清华大学出版社于2023年出版发行中文版。而且中文版与时俱进,进一步包含不少原版在2022年内没有包含的最新改动,推荐深入学习阅读。

中文版:

2.《Beautiful C++: 30 Core Guidelines for Writing Clean, Safe, and Fast Code》

推荐程度:4.5x

推荐范围:初级/中级

伴随着C++11的改良,其实C++正式大步向着clean,safe,fast的方向前进,讲述C++ clean Code的书籍很多,包括经典的《Effective C++》和《More Effective C++》 以及后续2018年开始的项目《C++ Core GuideLines》。本书也是在C++ Core GuideLines的项目技术上,反其道而行之,只保留最重要的三十个规则,并且伴随这些规则编写诸多样例说明这些规则是如何生效的。本书的所有代码均加载在godbolt.org上,借助在线编译器的强大功能,深入讨论Core GuideLines对编译层级的优化效果。(本书和上本书各有千秋,但是二者都相互推荐阅读对方XD)

CUDA语言

1. 《Programming Massively Parallel Processors (Fourth Edition)》

推荐程度:5.x

推荐范围:初级/中级

CUDA方面其实最好的教材还是CUDA offical 的两本教程,但是,近些年来,伴随着国产化并行处理设备的研发,其实越来越重要的是并行计算处理器和计算机体系架构设计。本书作为经典多次再版的并行计算处理器教材,基本上所有CUDA开发人员都能通过学习本书收获不一样的感悟。另外,本书看似没有学习代码,所有代码只有局部代码。其实,本书的学习代码大多数都直接或者间接融合进cuda-samples项目。这足以证明本书在CUDA开发流程中经典程度堪比《Computer Architecture: A Quantitative Approach》在计算机架构中的地位。

2.《programming, Learn CUDA Programming A beginner's guide to GPU 10.x & C/C++》

推荐程度:4.x

推荐范围:初级/中级

这本书就是完全写代码的书籍了,Packet出版社一贯的简洁明了,适用于新手快速入门编写代码的书籍。所有代码样例基于makefile,在Linux下可以快速便捷运行。由于基于CUDA 10.x起步,研究的特性基本上也就能快速使用到实际开发流程中。代码架构也非常简单直接,没有像其他书籍(点名批评《Parallel, Programming in CUDA - A Practical Guide》)一样繁琐。这本书美中不足的地方在于 代码库存在bug未修复。瑕不掩瑜,这本是仍旧是一本不错的CUDA入门书籍。

之前有同学建议我分享下我自己的CUDA学习的路线图,我没有什么特别规矩的路线图,基本上的原则就是多写代码。我可以把我整理出来的资源流程图像放在后面以供大家参考。

SIMD

伴随着算力需求和逻辑复杂度的增加,传统的纯CPU平台和纯GPU平台已经开始逐渐被异构计算平台所取代。目前主流的趋势并不在于更好的性能设备,而是如何对设备的更好利用效率更高的利用效率就能带商业化以后更高的利润率进而推广产品的利用。我认为这个时候恰好是最适合学习SIMD的时候,一方面我们有太多异构计算平台优化的需求,另一方面我们也有很多很好的国产化平台来应用SIMD技术。因此这部分我推荐的书籍包含x86架构下的SIMD优化书籍和Arm64平台的优化书籍。

1. 《Modern Parallel Programming & C++ & Assembly Language X86 SIMD Development Using AVX, AVX2 & AVX-512-Apress (2022)》

推荐程度:4.x

推荐范围:初级/中级

Intel的SIMD入门的初级指南和内联汇编的最好入门书籍。这部分以前都是在某些CPU的说明书中的矢量计算部分的内容,对于传统开发人员来说,基本上都是按照文档逐个查询使用。这本书把口耳相传的一些使用方法,细节整理出来,并在其基础上从AVX开始网上衍生,囊括AVX-512f这种最新特性。考虑到Intel CPU在服务器和个人电脑上的广泛使用,这本书对于研究高性能计算的同学可谓是一本不得不读的SIMD入门参考书。本书美中不足的地方在于它的代码没有独立出代码库,而是直接写在文本中,也就是说,阅读本书的过程,本身就是对本书代码的测试流程。本书后续带有大段汇编代码,汇编代码没有整理出单独的代码库,真是对书籍板式的严重损害。

2.《Foundations of ARM64 Linux Debugging, Disassembling & Reversing Analyze Code, Understand Stack Memory Usage & Code, Reconstruct Original C C++ & ARM64-Apress (2023)》

推荐范围:4.x

推荐范围:中级

算是在Arm Linux上进行C/C++开发的入门书,这本书深入描述C/C++的编译流程在Arm64架构的行为。编译原理并不是一个新东西,但是,大多数人没有注意到的就是C/C++的学习其实很大程度上就是对编译原理应用的学习。Arm64实在是广泛到我都不用什么举例了,包括苹果的M系列芯片,RK系列的开发板,Nvidia的Jetson嵌入式开发板,树莓派(甚至还有一些列国产化CPU)等。本书不仅适合嵌入式C工程师,也适合深度学习部署工程师开发针对Arm架构的并行计算优化方法(当然你可以直接抄ncnn)。另外本书其实可以配合《Arm汇编与逆向工程-蓝狐卷》使用效果更佳。
中文版:

数字图像处理

1. 《Digital Image Processing with C++: Implementing Reference Algorithms with the CImg Library》

推荐星级:4.5x

推荐范围:初级/中级

数字图像处理技术的入门级别小册子,算是C++工程师向着图像处理工程师转型不可不读的一本书。(当然,不少人认为图像处理就只有OpenCV,但是原理都无法理解的话,就别提适当地使用了)这本书从CImg 入手,短小精悍地讨论了图像处理流程中的重要算法方案的C++实现。CImg是一个纯Template实现的C++库,没有任何其他依赖,因此能有广泛的适应性,作为初学者上手学习图像处理实现是一个不错的选择。

2. 《Digital Image Enhancement, Restoration and Compression: Digital Image Processing and Analysis 4th》

推荐星级:5.x

推荐范围:初级/中级

学数字图像处理的人,没读过这本书就可以视为没学过数字图像处理。(当然,国内大多数人读的就是第三版的中文版,那么推荐阅读下第四版)

CUDA学习路线图

CUDA学习基本上跟C/C++的学习差不多,就只有多读书,多写代码即可。这里其实没有什么太多太好的等级划分。我这里能提供的就是一些CUDA可以阅读学习的书籍:

初级

初级的目标就是理解线程会发生什么。包括理解SIMT模型,Cmake对CUDA源代码的构建编译流程,CUDA代码执行的流程,一些重要概念,比如共享内存,同步等。这个等级的要求就是能写出CUDA代码即可,比如深入阅读和学习上面的CUDA推荐的第一第二本书。这个阶段需要大量的代码编写,让其不断熟悉基础的CUDA 概念,写法和一些库的使用(cuBlas等等)。

中级

中级的目标就是控制线程会发生什么。在理解的基础上,我们需要去控制CUDA中的线程按照我们需要的方式进行。现代CUDA提供了非常多控制线程的方式,比如CUDA runtime API 和 cooperative-group等,这个阶段不仅需要大量测试,更需要去阅读和学习Nvidia offical的两本教材/当前GPU的架构特点。并且去深入CUDA的一些特性比如Tensor Cores等等,来获得最优的性能实现。

这个阶段开始,我推荐注册GTC的账号,可以多读读GTC的一些PPT,总是会有一些如何做事情的新观念。

高级

高级的目标就是设计线程会发生什么。代码的优化是永无止尽的,甚至可能近些年要耗费精力做的优化措施,在未来只要一两条指令就解决掉了。难道这样就代表我们的工作没有什么意义吗?不是的?高级阶段的主要目标就是设计整个代码流程,来让这种优化能够特别简单地进行。类比忒修斯之船(Ship of Theseus),高级学习的路线就是让这种更新更加快速/更加适应性的发生。(进一步,高级的开发人员的思维也应该是这样的,发现环境的变化,主动适应环境的变化和主动对自身的调整)。

2024年博客更新计划

今年其实没啥太多计划,随缘更新,反正范围就是C/C++/CUDA/数字图像处理。熟悉我的同学知道我新工作与信号处理有关系,那么可能今年会有一点信号处理的内容。就这样。

今年也是要元气满满地学习鸭!

最后,防止有同学找不到上述电子书,请学着用这个.


小粥粥
2 声望4 粉丝

终生学习者