前两天陪一个小伙伴看并发编程的项目,这里总结一下。
在long long ago的最开始,使用并发编程其实是解决低速的IO操作和高速的cpu运行速度不匹配的问题,再然后有了cpu出现多核的现象,有了并行思想就可以将多核cpu协同工作。
再然后,出现了类似于我们现在网线一样的东西,并行程序能够让多台计算机进行协同工作完成复杂的任务。
其实现在google的超大规模集群也是一个大型的并行程序在上面运行,只是这个程序非常大,而且自动管理这个用高速通道链接的集群,所以我们交它为超规模的集群操作系统。
怎么来完成这个并行程序的管理起来,让这个集群快速的完成我们的任务呢,就是非阻塞机制,让集群发挥最大的工作能力,而不是等待。
后来有了异构运算的设备,比如GPU,TPU这些,CPU的机制是通过流水线,复杂运算指令集和状态管理来完成我们的日常工作,这是在指令集中寻找高并发操作。
而GPU和TPU大致是通过多核来完成复杂的操作,但是我感觉很遗憾的是,这些核心现在统一时间,同一批次只能运行一个指令,虽然人多力量大,但是运算的复杂性往往不能和cpu向对比,希望以后的并行运算硬件能够做到非相关任务之间的并行吧,估计也不太远了,伟大的祖国说不定可以弯道超车呢,哈哈。
话说回来,其实并行运算,就是重在各个运算核心的协同。在项目源码中,大量的使用链表来完成这个目的,链表的作用相当于流水线,执行得快一点的结果就堆在链表这个生产线上,可以让多个程序来一起完成,而不是一对一的等待一个程序来接手处理,宏观来看,就是快速执行整个工作流程。
上图处理流程看起来很复杂,通过添加缓慢的运算节点协同工作,来处理释放快速运算的能力,而不是等待,整个图看起来很复杂,其实可以通过简单的数据链表和同步机制完成,以后就是并行运行的硬件来完成。
哈哈,欢迎交流。