这个系列是对CUDA并行计算课程的复习回顾,主要用作个人复习之用,难免有很多疏漏之处,错误的地方请在评论区指出,谢谢。
教材:Programming Massively Parallel Processors A Hands-On Approach 第3版
课程参照:伊利诺伊大学ECE408
下方是胡文美教授讲授ECE408的配套资源网页:Home Pagehttp://gputeachingkit.hwu.crhc.illinois.edu/
1.CPU与GPU区别
主要区别在于:
- CPU(latency-oriented design):面向延迟的设计
- GPU(throughput-oriented design):面向吞吐量的设计
总结:串行->CPU,并行->GPU
所以在后文将会提到一个概念:异构并行计算。
对于具有一个或很少线程的程序,具有较低操作延迟的CPU可以实现比GPU高得多的性能。当程序有大量线程时,具有更高执行吞吐量的GPU可以实现比CPU高得多的性能。
举例:
下图中将一个桃子视为一个应用程序,“桃子的核”指的是这个应用程序中sequential的代码,假如想要将并行计算应用于这些部分,就会像咬到桃子的核一样感觉不太好。这些部分往往很难并行化,但CPU非常擅长处理这些部分。好消息是,这些部分虽然占据了很大一部分代码,但往往只占应用程序执行时间的一小部分。
剩下的就是我们所说的“桃肉”部分,这些部分很容易并行化。CUDA编程模型旨在覆盖更大的桃子肉部分。在实际工程中,其实也是如此,我们的目标是找到能够并行的部分,再对能够并行的代码进行并行计算,而不是关注“桃子的核”部分能否并行实现。