《基于CUDA的并行程序设计》学习笔记(一)

《基于CUDA的并行程序设计》学习笔记(一)_第1张图片


第1章 并行计算概述

1.1 并行计算简介

对于计算机而言,“并行”就是同一时间间隔内,增加操作量,多个运算部件共同完成一个任务。并行计算(parallel computing)就是由运行在多个部件上的小任务合作来求解一个大规模计算问题的一种方法。
在科学计算领域,待求解问题的规模也越来越大,采用并行计算可以降低单个问题求解的时间,增加问题求解规模,提高问题求解精度,改善多机同时执行多个串行程序的容错性、提高可用性和吞吐率。

1.2 并行处理的计算机体系结构

1.2.1 并行计算机分类

Flynn分类法
Flynn提出指令流、数据流和多倍性的概念,把不同的计算机分为四大类。
按照指令和数据流不同的组织方式,计算机系统可分为四类:
(1) 单指令单数据流(Single Instruction stream and Single Data stream,SISD):SISD其实就是传统的顺序执行的单处理器计算机,其指令部件每次只对一条指令进行译码,并只对一个操作部件分配数据。流水线方式的单处理机有时也被当成SISD。
(2) 单指令多数据流(SIMD) 特性:各处理机以同步的形式执行同一条指令
(3) 多指令单数据流(MISD) 特性:被证明不可能,至少是不实际
(4) 多指令多数据流(MIMD) 特性:能够实现作业,任务,指令等各级全面并行

1.3 并行算法的设计方法

并行算法是适合在并行计算机上实现的算法。并行算法的目的是用增加空间复杂度来降低时间复杂度。

1.3.1 并行算法的相关概念

  • 粒度
    粒度(granularity)是各个多处理机可独立并行执行的任务大小的量度。并行粒度是个相对的概念。

  • 并行算法的时间复杂性
    并行算法的时间复杂性用函数f(n)表示。其中,n 为输入规模,f 为从第一台处理机开始执行算法直到最后一台处理机完成该算法所执行时间的最大值。

  • 并行算法的耗费
    并行算法的耗费 = 时间复杂度 x P (P为并行处理机台数)

  • 并行算法的加速比
    并行加速比是表示采用多个处理器计算速度所能得到的加速的倍数。设tseq表示用串行机求解某个计算问题所需的时间,tP是用P个处理机求解该问题所需的时间。
    定义1.3.1 P个处理机加速比为

    Sp=t1tP

    定义1.3.2 并行加速比
    S^p=tseqtP

    一般来说, S^p<Sp ,因为并行操作系统的开销大于串行系统。

  • Amdahl定律或Ware定律

    Sp=P1s+s×P

    式中,s为只能串行执行的运算量百分比。其余P 个处理器可以并行执行的运算量的百分比为1-s,忽略通信与同步等由并行引起的开销,0≤s≤1;对任意多个处理器,有 Sp1/s

  • 并行效率

    Ep=SPP

    当加速比 SP 接近于P 时,效率 EP 接近于1。

  • 算法并行度
    算法并行度是算法中可并行实现部分的操作数。例如,两个n维向量a和b之和: ai+bi ;它们是独立的,并且可以并行执行,该算法的并行度为n。

  • 并行算法成本 C(n)

    C(n)=tp(n)P(n)

    式中, tP(n) 为并行算法的运行时间, P(n) 为处理器的个数。
    成本最坏的情况是求解一个问题时所需的执行步数。并行算法最优成本是在数量级上等于最坏情况下串行求解此问题所需的执行步数。

  • SIMD、MIMD、同步和异步算法
    按照横向作业层分解,可将并行算法分为SIMD算法和MIMD算法。如果一个算法的每个并行层都是SIMD层,则称为SIMD算法;若部分与全部并行层是MIMD层,则称为MIMD算法。
    按照纵向进程分解,可以将算法分为同步算法和异步算法。所谓同步算法,是并行算法有k>1个进程,这些进程的若干操作要等待另一些进程中的操作执行后才能执行。异步算法是每个进程中的操作都不需要等待其他进程的操作执行。
    SIMD算法一定是同步算法,异步算法是MIMD算法,但是同步算法也可以是MIMD算法。同步算法需要进程之间的通信取得同步,这会引起某些进程封锁等待需要信息。异步算法进程之间不需要通信以同步,而是通过读取存放在存储器中的公有变量动态地更新来实现同步。

1.3.2 设计并行算法应注意的问题

  • 问题的并行性分析

  • 通信成本

  • 算法依赖于计算机结构模型

  • 算法与数据的存储分布有关

  • 并行算法和串行算法的性质不同

1.3.3 并行算法的通用设计方法

一般来说,设计并行算法主要有两大类。一是由串行算法改写,二是由问题出发直接进行并行算法设计。近年来,通用的策略有以下几种:

  • 分而治之技术
    将一个大的问题分解成n个大致相等的子问题,然后由每个处理器处理相应的子问题,最后将各处理器的部分解汇总在一起,就得到原问题的解。

  • 路径折叠(折半)技术
    Wyllie的路径折叠技术最先应用于链表结构。

例1 已知n个元素的单向链表,计算链表每个元素后面链接的元素个数,称为表计数问题。

设表长为n,除表尾一个元素外,其他每个元素i的后继指针 D(n) 都指向后继元素i+1。若表最后一个元素为t,则约定 D(t)=NIL,D(D(t))=D(t) 。设第i 个在链表中元素后面链接的元素个数为 C(i) ,则下述过程将完成链表计数。

算法:LIST RANKING PROBLEM

begin
(1) for each i:1<=i<=n pardo    /*赋初值*/
        C(i)=1;
        if i=t then C(i)=0 endif
    endfor
(2) for k=1 to ⌈log n⌉1= do
        for each i: 1<=i<=n pardo
            (2.1)  C(i)=C(i)+C(D(i));   /*同折叠后的邻接顶点值相加*/
            (2.2)  D(i)=D(D(i));
            (2.3)  if i=t then C(i)=0 endif
        endfor
    endfor
end 

所谓的折叠主要体现在第(2.2)步。这个算法的形象说明如下图所示:
《基于CUDA的并行程序设计》学习笔记(一)_第2张图片

  • 迭代改进技术
    这种技术不是直接寻求问题的解,而是通过多次迭代逐步改进接近问题的解,最后求得问题解。每次迭代称为一个阶段,每个阶段的工作是使候选解的个数减少一个常量因子。

并行算法的计算模型如下图所示:
《基于CUDA的并行程序设计》学习笔记(一)_第3张图片

1.4 基于各种并行处理体系结构的算法对比

1.4.1 SIMD算法

具有K 个进程和n个作业层的SIMD算法的基本特征如下。
(1) n>1,同步算法。
(2) 每个并行层中的作业彼此相同,即每个并行操作步所含的操作完全相同。
(3) 能在一个具有K 台处理机的SIMD系统中实现,一个并行操作步由一条指令控制。
特征(2)中的操作包括运算和信息传送。

1.4.2 MIMD算法

具有K 个进程和n个作业层的同步SIMD算法的基本特征如下。
(1) n>1,即为同步算法。
(2) 每个并行层中的作业可彼此不同,即每个并行操作步所含操作可两两相异。
(3) 能在一个具有K 台处理机的MIMD系统中实现,k 条指令流分别控制k 个进程。
(4) 进程之间需要交换信息,而且通信时需要取得同步,或者说有些进程的若干操作需要等待另一些进程中的某些操作执行之后方能执行。

MIMD和SIMD的区别是:MIMD适合多指令流,SIMD适合单指令流。MIMD的多指令操作包括运算和信息传送。

MIMD算法设计需要注意下面4个问题。
(1) 给定一个具有可并行性的问题,如何将这个问题分成若干个进程,并使它们朝解的方向有效工作。
(2) 什么机制允许进程一起工作,在程序语言中如何表示这些机制。
(3) 死锁是什么,如何避免死锁问题。
(4) 在处理机中,如何调度这些进程。

MIMD并行算法可分为3类:流水线算法、划分算法和松弛算法。

1.4.3 MIMD进程通信和死锁

  • 通信和同步
    通信满足了进程的同步要求,同步能控制事件的秩序和控制冲突。

  • 共享变量同步化
    在通过共享变量实现同步化的系统中,同步化通常采用互斥条件同步化两种方式来实现。

  • 死锁
    在并行进程中,如果部分进程占着非预先占有的资源,而这些资源又是其他进程所必须的,那么这些部分进程是死锁的。死锁存在于非监督方式下。死锁存在满足4个条件:互斥、非预先占有、资源等待和资源循环等待。
    解决死锁有3种方法。第一种是死锁发生时,立即查明死锁原因。第二种是控制分配所需资源的优先信息来避免死锁。第三种是禁止互斥和资源等待。

1.4.4 MIMD任务调度

任务分配和调度的目的就是将任务分配给各个处理机,并使算法的执行时间达到最小。任务调度有两种基本模型:确定性模型和非确定性模型。

你可能感兴趣的:(CUDA)