最近从广丰汽车辞职后,今天整理书籍的时候发现这边很久没看的书,从新拾起来看。这本书代码比较少多数是概念性(有部分参杂个人理解-和官方有些出入)。
并行编程在同一时间运行多个CPU内核来提升应用程序的速度。看似很好的东西写起来确实很困难要有很好的数学功底大部分靠算法支撑。要想高效使用系统CPU的资源,需要把应用程序分割成一块一块的在同一时间运行。微软在.Net Framework 4.0开始引入这样的编程模型,任务并行简称(TPL)和并行语言集成查询(PLINQ),后者应该大家用的频繁些。
1.潜在并行--这个好处就是在并行硬件可用的时候程序运行的更快,硬件并行不能用的时候,程序运行速度也能和顺序程序一样。
随着多核的普及应用程序需要能够适应不同性能的硬件迎合现在与未来,这就是潜在并行的动机。
假如现在有个for循环独立重复执行1万次把它重复分配并行工作,这时候体现出了划分工作取决内核的数量,通常情况下循环的速度与内核的数量陈正比的关系。
2.分解、协调、可扩展共享
设计和实现一个并行应用程序分三个方面:(1)、把工作分解成离散单元(任务)的方法 2、协调这些任务并行运行的方法 (3)、执行并行任务的时候数据共享与扩展。
接下来就是了解任务,任务就是协同工作的一系列顺序操作,有它们共同完成一个大的操作(工作顺序单元,任务应该大、独立、数量足够多让内核都运行起来,但任务不是线程,2者采用调度的方法不用)。
在构建任务的时候需要考虑确定一个重要因素就是粒度的大小选择。才能有效利用硬件资源。
3、协调任务
协调任务就是在同一时间有多个任务在运行但它们都是相互独立。但有的时候它们还是会有依赖的关系,还是会受执行顺序和并行程度的底层算法限制。这种限制是有控制流或数据流引发的。
4、数据可扩展共享
不同任务之间通常需要共享数据。但程序是并行运行,程序的不同部分之间可能会出现相互抢一个内存中一个位置的数据,解决方案有同步线程。
在特定情况下通过阻塞模式并发线程来实现并发线程同步,例如 锁、原子级别的对比交换操作,或者信号灯。这些都可以达到顺序访问数据。但对于共享数据添加锁或者其他顺序访问同步机制会降低应用程序的并行性,在并行性当中有一些技术允许共享数据的同时又不降低性能和出错率。这些技术包含了:使用不可改的只读数据,限制程序对共享变量的依赖,在算法中引入了新的步骤在适当的地方检查合并点对可变状态的本地描述,可扩展共享技术可能会牵涉到对现有算法 的更改。