
并行算法设计与性能优化 刘文志
文章平均质量分 88
从不同层次,不同级别粗略介绍并行化算法的经典书籍。
高性能计算工程师
做一个极客!
展开
-
第12章 并行算法设计的一般准则
12.1 并行算法设计的14准则1. 查找算法的热点并优先考虑热点的并行化8-2定律;选用合适的工具;查找程序的热点可参考剖分软件的手册;2. 找出算法中的并行性一般而言,并行性意味着不相关/独立,更详细地说,一些计算任务与另一些计算任务无关。3. 自外而内与自内而外相比于自内而外,自外而内能够更早找出可并行化的部分,并且粒度通常也比较大,因此更适合多核并行,多进程和多线程。在自外而内的方法中...原创 2022-03-18 14:20:27 · 545 阅读 · 0 评论 -
第11章 超级并行
本章关注如何充分发挥计算机系统多层次硬件的计算能力,称之为超级并行。现实的超级并行一般分为三层:1.多机:通常使用网络将多个计算机连接起来。基于进程的MPI天生适合此类系统。编程时,通常需要大粒度;2.多核:基于线程机制的OpenMP和pthreads是首选的;3.GPU或SIMD向量:X86架构支持SSE/AVX指令,在这一层次需要利用生产商提供的汇编指令接口编程,但是通常编译器已经包装它们,以内置函数的方式提供,以方便使用。原创 2022-03-18 11:18:33 · 754 阅读 · 0 评论 -
第10章 如何并行遗留代码
通常对一个标量串行软件进行并行化有两种方法:部分并行化:适合热点比较集中、涉及代码较少、代码的模块化比较好的软件。大多数程序软件满足80%-20%定律。整体并行化:适合热点分散且整体的并行性很好的软件。整体并行化需要了解软件的整体流程逻辑、逻辑架构、物理架构、数据分布、数据相关性和作用在数据上的处理。在一些情况下,完成局部并行化后,原来没有并行化的部分成了瓶颈,为了性能,此时可能需转化成整体并行化。10.1 找出软件的计算热点1. 如何选择测试数据集大小通常可以更改程序使用的数据集大原创 2022-03-17 18:54:39 · 1048 阅读 · 0 评论 -
第9章 并行编程模式实践
为了挖掘硬件的性能,并行算法的实践模式还与具体的硬件有关。模式的意义在于挖掘算法的相似性,以同样的方式解决类似的问题。9.1 map模式map实践模式直观的表述是:对每个数据施加同样的运算。在应用map模式时,需要注意算法的粒度和硬件的粒度。算法的粒度是指:某些应用在一种粒度上看是map模式,而在另一种粒度上看却不是map模式。例如对300块不同的数据排序,那么对数据块来说,是map模式。对于块内的每一个数据而言,这又不是map模式,因为对每个数据操作可能并不相同。硬件的粒度是指:主原创 2022-03-17 16:06:41 · 903 阅读 · 0 评论 -
第8章 并行算法缺陷
并行引入的问题和缺点常见如下:竞写、死锁、饿死、原子操作、内存栅栏、缓存失效和伪共享。8.1 启动结束时间由于缓存的刷新,操作系统启动、调度和结束进程或线程都是耗时的操作,故通常不建议在CPU上频繁创建和结束进程、线程,而是一次创建,多次重复利用。for (int iter = 0; iter < num; iter++)#pragma omp parallel{ doSomething();}// 优化后#pragma omp parallelfor (int原创 2022-03-16 09:55:14 · 1015 阅读 · 0 评论 -
第6章 并行编程模型及环境
并行编程模型大多数以数据和任务(过程化的操作)为中心来命名。一个具体的并行应用往往使用了多种并行编程模型。并行编程模型是并行算法的基础,并行算法的具体实现依赖于软硬件支持的并行编程模型。原创 2022-03-15 10:59:23 · 1937 阅读 · 0 评论 -
第7章 并行算法设计方法
软件开发人员可以利用硬件的特性来设计算法,也可以利用应用的某些也行来优化算法等。一个好的并行算法通常具有以下特点:具有并行性的恰好是热点;可扩展性好;易于实现;为性能考虑,应当让所有的控制流尽量自由地运行。除非必要,尽可能不要对控制流的执行顺序做限制。通常并行算法的设计设计几个部分:划分、通信、结果合并和负载均衡。7.1 划分划分的目的是将计算任务分成多个部分,以便多个控制流同时处理。通常划分的对象有两种:一个计算任务,比如如何划分看电视和吃饭这个计算任务,又称为任务划分;另原创 2022-03-14 16:03:54 · 2900 阅读 · 0 评论 -
第5章 依赖分析
依赖分析能够找出程序代码中那些部分必须串行执行,那些部分可以并行执行,这可以根据粒度分为两个层次:指令级依赖:分析相邻几条指令间的依赖以决定这几条指令是否能够利用流水线执行。循环级依赖:分析循环建是否存在指令级依赖,这是循环并行化的基础工作。指令级依赖分析是优化流水线性能的基础,而循环级依赖分析则是向量化和数据并行的基础。如果能够确定循环中不存在依赖,那么该循环便可由多个控制流同时执行。细粒度的循环依赖分析可以确定代码是否能够被向量化。理想地说,依赖分...原创 2022-03-12 09:18:51 · 1239 阅读 · 0 评论 -
第4章 串行代码性能优化
一方面,串行代码优化有时能获得成千上万倍的加速;另一方面因为单个并行控制流的内部依旧是串行的。一般而言,不同算法上的优化是最有效的,要选择性能最优的算法并实现。假设你已经有了一个科研运行并能够得到正确结果的程序,需要再此基础上进行优化,本章将串行代码的优化分为以下几个层次:系统级别:要求找出程序的性能控制因素以做针对性的优化;应用级别:在程序编写前就要确定应用的配置,应用级别的优化相对比较简单,且实现后性能比较稳定;算法级别:选择不同的数据组织...原创 2022-03-10 14:29:39 · 1118 阅读 · 0 评论 -
第3章 算法性能和程序性能的度量与分析
如果能够在编写代码前就依据某些原创 2022-03-09 15:02:26 · 2219 阅读 · 0 评论 -
第2章 现代处理器特性
程序的最终性能由运行它的处理器实现,只有了解目标处理器的特性,才能写出高效的代码。现代处理器利用了指令集并行技术,同一时刻存在多条指令同时执行,并且处理器执行的顺序无须和汇编代码给出的指令顺序完全一致,编译器和处理器只需要保证最终结果一致,这类处理器称为“乱序执行处理器”。而严格按照顺序依次执行一条指令,只有前一条执行完成才开始执行下一条指令的处理器,称为“按序处理器”。处理器的处理速度远快于内存读写速度,为了减少访问数据时的延迟,现代主流处理器主要采用了这两种方式:利用程序的局部性特点:采用了原创 2022-03-08 16:29:08 · 1012 阅读 · 0 评论 -
第1章 绪论
各厂商纷纷通过各种方式提升计算能力,如提高指令级并行能力,在一个时钟周期内执行更多指令、向量指令、多核和超线程技术等。从长远来看,最有可能引领未来的是向量化和多核技术:向量化是指使用同一条指令同时操作多个数据;多核技术是采用在同一个芯片上集成多个核心的办法。高端的服务器版本则会集成多个多核处理器,这称为多路。通过将几百,几千核心集成在一块硅片上以满足图形图像及视频对性能的需求,这称为众核。1.1 并行和向量化的作用并行和向量化的首要作用是尽量发挥硬件提供的全部计算能力,以减少延迟(更快地完成原创 2022-03-07 10:26:14 · 1115 阅读 · 0 评论 -
第0章 前言
IT行业为啥急需这本书,先让笔者来介绍并行,并发和代码性能优化三个概念:并行对应的英文单词是parallelism,是指在具有多个处理单元的系统上,通过将计算或数据划分为多个部分,将各个部分分配到不同的处理单元上,各处理单元相互协作,同时运行,一达到加快求解速度或者提高求解问题规模的目的。并发对应的英文单词concurrency,并发是指一个处理单元上运行多个应用,各应用分时占用处理单元,是一种微观上串行,宏观上并行的模式。代码性能优化是指通过调整源代码,使得其生...原创 2022-03-04 21:26:59 · 254 阅读 · 1 评论