新書推薦:
《
传统文化有意思:古代发明了不起
》
售價:NT$
199.0
《
亚述:世界历史上第一个帝国的兴衰
》
售價:NT$
490.0
《
人工智能与大数据:采煤机智能制造
》
售價:NT$
440.0
《
新民说·逝去的盛景:宋朝商业文明的兴盛与落幕(上下册)
》
售價:NT$
790.0
《
我从何来:自我的心理学探问
》
售價:NT$
545.0
《
失败:1891—1900 清王朝的变革、战争与排外
》
售價:NT$
390.0
《
万千心理·我的精神分析之道:复杂的俄狄浦斯及其他议题
》
售價:NT$
475.0
《
荷马:伊利亚特(英文)-西方人文经典影印21
》
售價:NT$
490.0
|
關於作者: |
Tolga Soyata于1988年在伊斯坦布尔技术大学电子与通信工程系获得学士学位,1992年在美国马里兰州巴尔的摩的约翰·霍普金斯大学电气与计算机工程系(ECE)获得硕士学位,2000年在罗切斯特大学电气与计算机工程系获得博士学位。2000年至2015年间,他成立了一家IT外包和复印机销售服务公司。在运营公司的同时,他重返学术界,在罗切斯特大学电气与计算机工程系担任研究员。之后,他成为助理教授,并一直担任电气与计算机工程系教职研究人员至2016年。在罗切斯特大学电气与计算机工程系任职期间,他指导了三名博士研究生。其中两人在他的指导下获得博士学位,另一位在他2016年加入纽约州立大学奥尔巴尼分校担任电气与计算机工程系副教授时留在了罗切斯特大学。Soyata的教学课程包括大规模集成电路、模拟电路以及使用FPGA和GPU进行并行编程。他的研究兴趣包括信息物理系统、数字健康和高性能医疗移动云计算系统等。
Tolga Soyata从2009年开始从事GPU编程的教学,当时他联系Nvidia将罗切斯特大学认证为CUDA教学中心(CTC)。在Nvidia将罗切斯特大学认证为教学中心后,他成为主要负责人。之后,Nvidia还将罗切斯特大学认证为CUDA研究中心(CRC),他也成为项目负责人。Tolga Soyata在罗切斯特大学担任这些计划的负责人直到他于2016年加入纽约州立大学奥尔巴尼分校。这些计划后来被Nvidia命名为GPU教育中心和GPU研究中心。在罗切斯特大学期间,他讲授了5年GPU编程和高级GPU项目开发课程,这些课程同时被列入电气与计算机工程系以及计算机科学与技术系的课程体系。自2016年加入纽约州立大学奥尔巴尼分校以来,他一直在讲授类似的课程。本书是他在两所大学讲授GPU课程的经验结晶。
|
目錄:
|
译者序
前言
关于作者
第一部分 理解CPU的并行性
第1章 CPU并行编程概述2
1.1 并行编程的演化2
1.2 核心越多,并行性越高3
1.3 核心与线程4
1.3.1 并行化更多的是线程还是核心5
1.3.2 核心资源共享的影响6
1.3.3 内存资源共享的影响6
1.4 第一个串行程序7
1.4.1 理解数据传输速度8
1.4.2 imflip.c中的main 函数9
1.4.3 垂直翻转行:FlipImageV 10
1.4.4 水平翻转列:FlipImageH 11
1.5 程序的编辑、编译、运行12
1.5.1 选择编辑器和编译器12
1.5.2 在Windows 7、8、10平台上开发12
1.5.3 在Mac平台上开发14
1.5.4 在Unix平台上开发14
1.6 Unix速成15
1.6.1 与目录相关的Unix命令15
1.6.2 与文件相关的Unix命令16
1.7 调试程序19
1.7.1 gdb19
1.7.2 古典调试方法20
1.7.3 valgrind22
1.8 第一个串行程序的性能22
1.8.1 可以估计执行时间吗23
1.8.2 代码执行时OS在做什么23
1.8.3 如何并行化24
1.8.4 关于资源的思考25
第2章 开发第一个CPU并行程序26
2.1 第一个并行程序26
2.1.1 imflipP.c中的main 函数27
2.1.2 运行时间28
2.1.3 imflipP.c中main 函数代码的划分28
2.1.4 线程初始化30
2.1.5 创建线程31
2.1.6 线程启动执行32
2.1.7 线程终止(合并)33
2.1.8 线程任务和数据划分34
2.2 位图文件35
2.2.1 BMP是一种无损不压缩的文件格式35
2.2.2 BMP图像文件格式36
2.2.3 头文件ImageStuff.h37
2.2.4 ImageStuff.c中的图像操作函数38
2.3 执行线程任务40
2.3.1 启动线程41
2.3.2 多线程垂直翻转函数MTFlipV 43
2.3.3 FlipImageV 和MTFlipV 的比较46
2.3.4 多线程水平翻转函数MTFlipH?47
2.4 多线程代码的测试计时49
第3章 改进第一个CPU并行程序51
3.1 程序员对性能的影响51
3.2 CPU对性能的影响52
3.2.1 按序核心与乱序核心53
3.2.2 瘦线程与胖线程55
3.3 imf?lipP的性能55
3.4 操作系统对性能的影响56
3.4.1 创建线程57
3.4.2 线程启动和执行57
3.4.3 线程状态58
3.4.4 将软件线程映射到硬件线程59
3.4.5 程序性能与启动的线程60
3.5 改进imf?lipP61
3.5.1 分析MTFlipH 中的内存访问模式62
3.5.2 MTFlipH 的多线程内存访问63
3.5.3 DRAM访问的规则64
3.6 imf?lipPM:遵循DRAM的规则65
3.6.1 imflipP的混乱内存访问模式65
3.6.2 改进imflipP的内存访问模式65
3.6.3 MTFlipHM :内存友好的MTFlipH 66
3.6.4 MTFlipVM :内存友好的MTFlipV 69
3.7 imflipPM.C的性能69
3.7.1 imflipP.c和imflipPM.c的性能比较70
3.7.2 速度提升:MTFlipV 与MTFlipVM 71
3.7.3 速度提升:MTFlipH 与MTFlipHM 71
3.7.4 理解加速:MTFlipH 与MTFlipHM 71
3.8 进程内存映像72
3.9 英特尔MIC架构:Xeon Phi74
3.10 GPU是怎样的75
3.11 本章小结76
第4章 理解核心和内存77
4.1 曾经的英特尔77
4.2 CPU和内存制造商78
4.3 动态存储器与静态存储器79
4.3.1 静态随机存取存储器(SRAM)79
4.3.2 动态随机存取存储器(DRAM)79
4.3.3 DRAM接口标准79
4.3.4 DRAM对程序性能的影响80
4.3.5 SRAM对程序性能的影响81
4.4 图像旋转程序:imrotate.c81
4.4.1 imrotate.c的说明82
4.4.2 imrotate.c:参数限制和简化82
4.4.3 imrotate.c:实现原理83
4.5 imrotate的性能87
4.5.1 线程效率的定性分析87
4.5.2 定量分析:定义线程效率87
4.6 计算机的体系结构89
4.6.1 核心、L1$和L2$89
4.6.2 核心内部资源90
4.6.3 共享L3高速缓存(L3 $)91
4.6.4 内存控制器92
4.6.5 主存92
4.6.6 队列、非核心和IO93
4.7 imrotateMC:让imrotate更高效94
4.7.1 Rotate2 :平方根和浮点除法有多差96
4.7.2 Rotate3 和Rotate4 :sin 和cos 有多差97
4.7.3 Rotate5 :整数除法乘法有多差98
4.7.4 Rotate6 :合并计算100
4.7.5 Rotate7 :合并更多计算100
4.7.6 imrotateMC的总体性能101
4.8 本章小结103
第5章 线程管理和同步104
5.1 边缘检测程序:imedge.c104
5.1.1 imedge.c的说明105
5.1.2 imedge.c:参数限制和简化106
5.1.3 imedge.c:实现原理106
5.2 imedge.c:实现108
5.2.1 初始化和时间戳109
5.2.2 不同图像表示的初始化函数110
5.2.3 启动和终止线程111
5.2.4 高斯滤波112
5.2.5 Sobel113
5.2.6 阈值过滤114
5.3 imedge的性能115
5.4 imedgeMC:让imedge更高效116
5.4.1 利用预计算降低带宽116
5.4.2 存储预计算的像素值117
5.4.3 预计算像素值118
5.4.4 读取图像并预计算像素值119
5.4.5 PrGaussianFilter1
|
內容試閱:
|
我经历过在IBM大型机上编写汇编语言来开发高性能程序的日子。用穿孔卡片编写程序,编译需要一天时间;你要留下在穿孔卡片上编写的程序,第二天再来拿结果。如果出现错误,你需要重复这些操作。在那些日子里,一位优秀的程序员必须理解底层的机器硬件才能编写出好的代码。当我看到现在的计算机科学专业的学生只学习抽象层次较高的内容以及像Ruby这样的语言时,我总会感到有些焦虑。尽管抽象是一件好事,因为它可以避免由于不必要的细节而使程序开发陷入困境,但当你尝试开发高性能代码时,抽象就变成了一件坏事。
自第一个CPU出现以来,计算机架构师在CPU硬件中添加了令人难以置信的功能来“容忍”糟糕的编程技巧。20年前,你必须手动设置机器指令的执行顺序,而如今在硬件中CPU会为你做这些(例如,乱序执行)。在GPU世界中也能清晰地看到类似的趋势。由于GPU架构师正在改进硬件功能,5年前我们在GPU编程中学习的大多数性能提升技术(例如,线程发散、共享存储体冲突以及减少原子操作的使用)正变得与改进的GPU架构越来越不相关,甚至5~10年后,即使是一名非常马虎的程序员,这些因素也会变得无关紧要。当然,这只是一个猜测。GPU架构师可以做的事取决于晶体管总数及客户需求。当说晶体管总数时,是指GPU制造商可以将多少个晶体管封装到集成电路(IC)即“芯片”中。当说客户需求时,是指即使GPU架构师能够实现某个功能,但如果客户使用的应用程序不能从中受益,就意味着浪费了部分的晶体管数量。
从编写教科书的角度出发,我考虑了所有的因素,逐渐明确讲授GPU编程的最佳方式是说明不同系列GPU(如Fermi、Kepler、Maxwell和Pascal)之间的不同并指明发展趋势,这可以让读者准备好迎接即将到来的下一代GPU,再下一代,……我会重点强调那些相对来说会长期存在的概念,同时也关注那些与平台相关的概念。也就是说,GPU编程完全关乎性能,如果你了解程序运行的平台架构,编写出了与平台相关的代码,就可以获得更高的性能。所以,提供平台相关的解释与通用的GPU概念一样有价值。本书内容的设计方式是,越靠后的章节,内容越具有平台特定性。
我认为本书最独特的地方就是通过第一部分中的CPU多线程来解释并行。第二部分介绍了GPU的大规模并行(与CPU的并行不同)。由于第一部分解释了CPU并行的方式,因此读者在第二部分中可以较为容易地理解GPU的并行。在过去的6年中,我设计了这种方法来讲授GPU编程,认识到从未学过并行编程课程的学生并不是很清楚大规模并行的概念。与GPU相比,“并行化任务”的概念在CPU架构中更容易理解。
本书的组织如下。第一部分(第1章至第5章)使用一些简单的程序来演示如何将大任务分成多个并行的子任务并将它们映射到CPU线程,分析了同一任务的多种并行实现方式,并根据计算核心和存储单元操作来研究这些方法的优缺点。本书的第二部分(第6章至第11章)将同一个程序在多个Nvidia GPU平台(Fermi、Kepler、Maxwell和Pascal)上并行化,并进行性能分析。由于CPU和GPU的核心和内存结构不同,分析结果的差异有时很有趣,有时与直觉相反。本书指出了这些结果的不同之处,并讨论了如何让GPU代码运行得更快。本书的最终目标是让程序员了解所有的做法,这样他们就可以应用好的做法,并避免将不好的做法应用到项目中。
尽管第一部分和第二部分已经完全涵盖了编写一个好的CUDA程序需要的所有内容,但总会有更多需要了解的东西。本书的第三部分为希望拓宽视野的读者指明了方向。第三部分并不是相关主题的详细参考文档,只是给出了一些入门介绍,读者可以从中获得学习这些内容的动力。这部分主要介绍了一些流行的CUDA库,比如cuBLAS、cuFFT、Nvidia Performance Primitives和Thrust(第12章);OpenCL编程语言(第13章);使用其他编程语言和API库进行GPU编程,包括Python、Metal、Swift、OpenGL、OpenGL ES、OpenCV和微软HLSL(第14章);深度学习库cuDNN(第15章)。
书中代码的下载地址为:https:www.crcpress.comGPU-Parallel-ProgramDevelopment-Using- CUDA Soyatapbook9781498750752。
Tolga Soyata
|
|