并发计算 VS 并行计算

写在前面

上一篇文章中,我们学习了如何在CUDA中隐藏数据传输,而其中用到的主要技术就是并发计算。这时你可能会问,这个专栏不是CUDA并行计算吗?怎么又说什么并发计算呢?其实,这里所说的“CUDA并行计算”并不是纯粹的并行计算,而是并行计算与并发计算相结合的一种技术。那么这两者的区别又是什么呢?我觉得是时候讲一下两者的区别与联系了,否则会对之后的学习产生误导。

什么是并行

并行(parallelism)是指在具有多个处理单元(如GPU或者多核CPU)的系统上,通过将计算或数据划分为多个部分,将各个部分分配到不同的处理单元上,各处理单元相互协作,同时运行,已达到加快求解速度或者提高求解问题规模的目的。

什么是并发

并发是一个程序、算法或者问题的可分解属性,它由多个顺序不依赖性或者局部顺序依赖性的结构或单元组成。这就意味着这些单元无论以何种顺序执行或者运算,最终结果都是一样的。

我们通常所接触到的并发大多是基于单处理机的,这常常是为了满足应用的功能需求。比如具有图形界面的程序,应该具有同时响应多个事件的能力,这样给用户的错觉就是同时执行,但实际上总的执行速度并没有提高。然而,并发并不总是基于单处理机的。对于基于多处理机的并发计算,可以获得很好的性能提升——大大提高执行速度。

区别

我在网上看到很多讲并发计算与并行计算区别的文章,感觉很多讲得不是很抽象就是不全面,因此我决定自己好好总结一下。闲话少说,先看一张图。

仔细看一下这张图,先有个大概印象再继续往下读。

loading ... ...

看完上面的图之后,这是我总结的几点:

  • 并发计算可以基于单处理器或者多处理器,基于单处理器时多个任务分时执行,轮流使用处理器;并行计算必须基于多处理器,多个任务同时使用多个处理器

  • 并发计算可以同时执行多个不同的任务;并行计算一般是同时执行多个相同的任务

NOTE:为了更好地比较并行与并发计算,我加入了串行计算。

  • 从专注程度上来看,三者的排名如下:

串行计算->并行计算->并发计算

串行计算最老实也最死板,任何时候只做一件事,雷打不动,这件完成才能做下一件事;并行计算相比就没有那么专注了,它可以同时做多个相同的事情;并发计算就更没有那么专注了,它可以同时做多个不同的事情。

联系

并行计算与并发计算关系密切。我们在操作系统课程中所学到的并发大多是基于单处理器的,进程交替执行,表现出一种同时执行的外部特征。这种并发计算无法实现真正的加速效果。

并行计算(纯粹的)通常是将一个较大的问题分为较小的多个子问题,然后同时处理这些子问题,类似于算法中的分治法。这种执行方式虽然可以获得较好的加速效果,但是还可以获得更好的加速效果。

在基于多核的计算中,常常将并发计算与并行计算相结合,这样可以获得比并行计算更好的加速效果。在专栏的上一篇文章中,我们应用的就是这个技术。

总结

这篇文章主要介绍了并行计算与并发计算的区别与联系。如果要深入地学习并发计算,可以参考操作系统的相关书籍,比如比较经典的《操作系统精髓与设计原理》。在掌握了二者的区别与联系之后,我们会继续学习CUDA并行计算。

参考资料

  1. 维基百科-Concurrent_computing

  2. 维基百科-Parallel_computing

  3. 维基百科-Concurrency (computer science))

  4. 操作系统精髓与设计原理 第六版, [美]William Stallings, 机械工业出版社

你可能感兴趣的:(并行,cuda)