在结果一致的情况下,算法流程的不同会导致计算量上的显著差异。算法复杂度包括时间复杂度和空间复杂度。不同排序算法的时间复杂度不同,而空间复杂度指的是在运行中需要额外开辟的储存空间。对于矩阵乘法来说,其空间复杂度不随问题规模的增大而增大,该算法不需要额外的临时存储空间。
计算机的运行速度通常以GFLOPS,TFLOPS和PFLOPS来衡量,分别代表每秒的十亿次,万亿次和千万亿次浮点数操作。2016年我国研制的神威太湖之光超级计算机,以每秒9.3亿次的实测运算速度夺得世界超算的榜首。
并行程序可以发挥多计算核心的优势,用层次化的计算代替之前的扁平化计算。冒泡排序算法的任何一次循环都需要建立在上一次循环的结果之上,因此本身不具有并行性。在并行计算平台上,由于奇偶排序的每对元素的交换不依赖于其他位的信息,非常适合用于并行执行,极大的提高了算法的执行效率。对于多核处理器,可以分析指令之间的依赖关系,找出程序中一组相互独立的指令并行执行;对于单核处理器,通过对指令进行分解,也可以利用流水线操作实现多条指令的并行执行。在宏观层面,并行可以分为两种:任务并行和数据并行。前者指在同样的数据上执行不同的操作,后者指在不同的数据上执行相似的操作。可以并行执行的指令需要满足以下条件:1,指令1的输入和指令2的输出交集为空2、两条指令的输出交集也要为空,不会对相同的变量执行写操作。
对于一条计算机指令,可以将其分解为若干个串行步骤,如取指令,译码,寄存器操作以及执行等,分别由处理器的不同部分来执行。这样的话,在单核处理器上也会出现宏观上的多条指令在执行。将原始问题拆分的粒度越细,越有助于提升并行潜力和加速比,但是线程或进程间同步和通信的开销也可能随之增大,所以需要找到一个合适的平衡点。并发(current):在宏观上有多个任务同时执行,但是在某一时刻只有一个任务使用执行器资源;而并行(parallel)指的是在任一时刻都有多个任务在同时执行,需要多核处理器的支持。并行计算可以分为两大类:进程的并行和线程的并行。所谓进程就是程序执行的一个实例,线程依附于进程而存在,是CPU调度的基本单元。在一个进程运行的过程中,可以根据需要释放出多个线程来执行可以并行的任务,并在完成任务后进行销毁。一般来说,多进程模型适用于分布式计算环境,多线程模型适用于共享内存环境。目前主流的GPU就属于多线程编程模型的范畴,而具有若干个计算核心的CPU被称为多核处理器,具有成百上千个计算核心的GPU被称为众核处理器。
CUDA C本质上是标准C语言的一个拓展。GPU并不能脱离CPU独立工作,CPU负责整个程序的调度,输入输出和串行部分的执行,GPU专职负责并行函数的执行,整体上属于异构的计算机体系。在数据科学领域,Matlab,R和Python是使用最广泛的开发环境,对数据分析工作有很好的支持,非常适宜算法研究和快速编程实现。目前,较新版本的Matlab已经内嵌了对GPU的支持,提供对用户几乎透明的并行计算环境。
人们通常会认为一个计算机系统的运算速度由它的处理器的性能决定,但是实际上制约计算机系统的实际运算速度的是数据的传输速率。计算机内部给部分之间的典型数据传输速率基本上都在每秒十几个GB的速度。这听起来已经是非常高的数据吞吐能力了,但是实际上绝大部分时间都花费在了数据传输上。因此,在高性能计算领域中要特别注意数据传输这个瓶颈的存在。只有尽可能降低数据传输的延迟,才有可能实现理想的性能提升和加速效果。为了量化并行计算的性能,人们通常采用加速比这个概念:一个程序的串行版本的运行时间与并行版本运行时间的比值。计算效率定义为加速比除以计算核心数。
阿姆达尔定理:假如一个程序中可并行部分的运行时间占总用时的比例为P,那么给定N个计算核心,并行版本的加速比上限可由下式给出:
当N趋于无穷大时,即计算核心足够多的情况下,加速比的上限等于1-P的倒数。可以看出,一个程序的并行潜力取决于其中不可并行部分所占的比例。古斯塔夫森定理也是用来描述程序的理论加速比,但是基于不同的理论假设。假设并行版本的运行时间由a+b来表示,分别代表串行和并行部分的运行时间,相对应的串行版本的运行时间为a+Nb,其中N为计算核心的数量,则加速比定义为
通过该理论可以看出,计算核心数量增加时,加速比线性增加的实现条件是:串行部分的计算量保持固定(a不变),可并行部分的规模线性增加(b不变),这相当于假设串行部分所占比例越来越小,或者P的值越来越大,因此这两个定理并不矛盾。
数据科学导论课程笔记(三):高性能计算
最新推荐文章于 2022-10-02 15:18:52 发布