武汉大学“多核架构及编程技术”精品课程理论教学

请在底部链接下载课件文档。

第一章 导论
1945年,美国研制了世界上第一台全自动电子数字计算机ENIAC(Electronic Numerical Integrator and Calculator,即电子数字积分器和计算器),是美国奥伯丁武器试验场为了满足计算弹道需要而研制成的,于1946年2月交付使用,共服役9年。ENIAC机的问世具有划时代的意义,表明计算机时代的到来。

计算机的发展按照硬件工艺可以分为以下几代:

第一代(1946~1958):电子管数字计算机。计算机的逻辑元件采用电子管,主存储器采用汞延迟线、磁鼓、磁芯;外存储器采用磁带;软主要采用机器语言、汇编语言;应用以科学计算为主。其特点是体积大、耗电大、可靠性差、价格昂贵、维修复杂。它奠定了以后计算机技术的基础。

第二代(1958~1964):晶体管数字计算机。晶体管的发明推动了计算机的发展,逻辑元件采用了晶体管以后,计算机的体积大大缩小,耗电减少,可靠性提高,性能比第一代计算机有很大的提高。主存储器采用磁芯,外存储器已开始使用更先进的磁盘;软件有了很大发展,出现了各种各样的高级语言及其编译程序,还出现了以批处理为主的操作系统,应用以科学计算和各种事务处理为主,并开始用于工业控制。

第三代(1964~1971):集成电路数字计算机。20世纪60年代,计算机的逻辑元件采用小(SSI)、中规模集成电路(SSI、MSI),计算机的体积更小型化、耗电量更少、可靠性更高,性能比第十代计算机又有了很大的提高。这时,小型机也蓬勃发展起来,应用领域日益扩大。主存储器仍采用磁芯,软件逐渐完善,分时操作系统、会话式语言等多种高级语言都有新的发展。

第四代(1971年以后):大规模集成电路数字计算机。计算机的逻辑元件和主存储器都采用了大规模集成电路(LSI)。所谓大规模集成电路是指在单片硅片上集成1000~2000个以上晶体管的集成电路,其集成度比中、小规模的集成电路提高了1~2个以上数量级。这时计算机发展到了微型化、耗电极少、可靠性很高的阶段。大规模集成电路使军事工业、空间技术、原子能技术得到发展,这些领域的蓬勃发展对计算机提出了更高的要求,有力地促进了计算机工业的空前大发展。

当前集成电路的发展已经进入特大规模(千万个以上元器件)的阶段,目前国际主流生产工艺技术已经到了90纳米、65纳米以及45纳米。

由于缺乏革命性技术变革,现有技术仍将保持自1970年以来的线性发展,但持续时间不可能无限延长。据2004年“国际半导体技术发展路线图(ITRS)”修订版预测,这种线性发展可能继续保持10~15年。但是晶体管数翻倍的期限正在加长,已经从18个月到24个月再到36个月,摩尔定律受到的挑战正不断增加。

一直以来,处理器芯片厂商都通过不断提高主频来提高处理器的性能,但随着芯片制程工艺的不断进步,从体系结构来看,传统处理器体系结构技术面临瓶颈,晶体管的集成度已超过上亿个,很难单纯通过提高主频来提升性能,而且主频的提高同时带来功耗的提高,也是直接促使单核转向多核的深层次原因;从应用需求来看,日益复杂的多媒体、科学计算、虚拟化等多个应用领域都呼唤更为强大的计算能力。在这样的背景下,各主流处理器厂商将产品战略从提高芯片的时钟频率转向多线程、多内核。

多核处理器最直接的发展则认为是始于IBM。目前的多核处理器的推出已经愈加频繁,在推出代号为Niagara的8核处理器之后,Sun还计划在今年年中推出Niagara 2处理器。IBM的Cell处理器,结合了1个PowerPC核心与8个协处理器构成的Cell 微处理器已经正式量产,并应用于PS3主机、医学影像处理、3D计算机绘图、影音多媒体等领域。而真正意义上让多核处理器进入主流桌面应用,是从IA阵营正式引入多核架构开始。继双核之后,英特尔已经在2006年11月抢先推出了四核产品,AMD也推出代号为巴塞罗那的四核处理器。

片上多核处理器(Chip Multi-Processor,CMP)就是将多个计算内核集成在一个处理器芯片中,从而提高计算能力。

按计算内核的对等与否,CMP可分为同构多核和异构多核。计算内核相同,地位对等的称为同构多核,现在Intel和AMD主推的双核处理器,就是同构的双核处理器。计算内核不同,地位不对等的称为异构多核,异构多核多采用“主处理核+协处理核”的设计,IBM、索尼和东芝等联手设计推出的Cell处理器正是这种异构架构的典范。

本章中,将重点讨论处理器的发展历史、目前的多核架构以及固件、操作系统对多核的支持。
第二章 多核架构及多核编程
本章主要介绍一些传统的并行计算理念及相应的知识结构,为进一步学习片上多核处理器的并行计算打下一个坚实的基础。本章介绍的内容包括:

并行计算机体系结构

了解并行计算机体系结构是开展并行计算研究的基础。为了设计一个高效率的并行算法,实现一个高效率的并行程序,需要对并行计算机体系结构有一定的了解。此部分内容主要包括:多级存储体系结构和并行计算机访存模型。

得益于主频和超标量指令级流水线技术的发展,现代微处理器的发展仍然遵循摩尔定律,峰值运算速度每18个月翻一番。相比较而言,内存的访问速度要比处理器执行速度慢很多,数据存取速度(即数据填充指令处理流水线的速度)难以满足微处理器的峰值计算速度,这就是所谓的内存墙(memory wall)性能瓶颈问题。多级存储体系结构是一种解决方案。

并行计算机的访存模型主要有:UMA模型、NUMA模型、COMA模型和NORMA模型。

并行计算模型

此部分内容主要从并行程序/并行算法的角度来介绍并行计算模型。依次讨论SIMD同步并行计算模型,包括共享存储的SIMD模型(即PRAM模型)和分布存储的SIMD模型(即SIMD互联网络模型);MIMD异步并行计算模型(更常用的并行计算模型),包括异步PRAM模型(从共享存储的MIMD-SM多处理机抽象而来)以及BSP、LogP和C3模型(从分布存储的MIMD-DM多计算机中抽象而来)等。

进程

现代操作系统中的一个重要概念是进程(process)。正是由于多个进程之间的相互通信,才决定了各类消息传递并行程序设计平台的出现。此部分内容主要介绍进程和进程间通信的基本概念。

线程

为了更好的理解并行编程环境,这里简要介绍另一个重要概念:线程(threads),线程又被称作轻量级进程。

并行编程环境

在当前并行计算机上,比较流行的并行编程环境主要有3类:消息传递、共享存储和数据并行,此部分内容对这3类并行编程环境的主要特征进行比较总结。

编程语言与编译器

此部分内容将探究在科学计算领域对并行编程支持已取得相当成功的三项技术:自动并行化、数据并行语言(HPF)、共享存储并行编程接口(OpenMP)。

并行计算性能评测

给定并行算法,采用并行程序设计平台,通过并行实现获得实际可运行的并行程序后,一个重要的工作就是,在并行计算机上运行该程序,评价该程序的实际性能,揭示性能瓶颈,指导程序的性能优化。性能评价和优化是设计高效率并行程序必不可少的重要工作。此部分内容介绍当前流行的并行程序性能评价方法,并讨论有效的性能优化方法。

常用并行数值算法

在科学与工程计算的许多问题中经常需要进行矩阵计算。矩阵乘、求解线性方程组和矩阵特征值问题是矩阵计算最基本的内核。本节主要介绍基于MPP并行计算机、机群和消息传递并行环境(MPI等)上的矩阵乘以及求解线性方程组的并行数值算法。

并行编译器

一个并行编译器大致可由三部分组成:流分析,程序优化和代码生成。其中,流分析是确定源代码中数据和控制的相关性;优化常常是将代码变换成与之等效但具有“更好”的形式,以利于尽量挖掘硬件潜力,最终达到全局优化的目的;代码生产通常涉及到从一种描述转换成另一种中间形式的描述,不同类型的计算机其并行代码的生成也各不相同。

第三章 多线程编程基础
线程(thread)是操作系统中比进程更小的可执行单元,现代操作系统大都支持线程机制以便节约资源并获得更好性能。本章介绍了进程、线程的基本概念,以及多线程的互斥同步的基本概念。

多线程的概念

多线程的每个线程执行一个单独的逻辑路径,可以将冗长的或非常耗时的任务放在后台处理。即使在只有单处理器的计算机上,使用多线程也可以非常显著地提高应用程序的响应能力和可用性。

多线程机制的优点:创建一个线程比创建一个进程的代价要小、线程的切换比进程间的切换代价小、充分利用多处理器、.数据共享和快速响应特性。

用户级线程和内核级线程

根据在用户空间还是在核心实现多线程机制,线程又被分为用户级线程(user level thread)和内核级线程(kernel level thread)。用户线程的所有管理工作都由在用户级实现的线程库来支持。内核级线程的所有管理操作都是由操作系统内核完成的。

多线程的映射模型

对于实现了用户级线程和内核级线程的操作系统,用户级线程和内核级线程之间的可以有不同的映射方式:多对一模型、一对一模型和多对多模型。线程池是一组被创建的线程的集合,当一个进程需要线程时,如果线程池中还有可用的线程,就从中取出一个投入使用,所以进程可以更快地使用一个线程而不必等待线程的创建。


线程的生命周期

本部分内容包括:线程的标识,通常用一个整数来标识一个线程;线程的创建;线程的终止和线程的状态。线程有四个基本的状态:就绪(ready)、运行(running)、阻塞(blocked)和终止(terminated)。

多线程环境下的进程控制语义

单线程环境下的进程控制接口在多线程环境下语义可能会发生变化,包括进程创建、进程终止、程序执行、信号处理等。

线程的同步

由于线程共享同一进程的内存空间,多个线程可能需要同时访问同一个数据。如果没有正确的保护措施,对共享数据的访问会造成数据的不一致和错误。为避免这种不确定的错误结果的出现,在两个线程访问共享数据的时候需要同步机制。

常用的同步机制包括临界区(critical section),信号量(simphore),互斥量(mutex),管程(monitor)。比较常用的同步方法是信号量和互斥量方法。

第四章 Windows多线程编程及其OpenMP编程技术

在Windows平台下可以通过Windows的线程库来实现多线程编程,可以利用Win32 API或MFC以及.Net Framework提供的接口来实现。实现方式的多样化给Windows编程带来了很大的灵活性,但也使得多线程编程变得复杂。

Win32 API是Windows操作系统为内核以及应用程序之间提供的接口,将内核提供的功能进行函数封装,应用程序通过调用相关的函数获得相应的系统功能。Win32 API提供了一系列处理线程的函数接口,来向应用程序提供多线程的功能。

MFC是微软基础函数类库(Microsoft Foundation Classes),由微软提供的,用类库的方式将Win32 API 进行封装, 以类的方式提供给开发者。在MFC类库中,提供了对多线程的支持。由于MFC是在Win32 API 基础之上进行封装的,其基本原理与Win32 API的基本实现原理很类似。MFC对同步对象作了封装,因此对用户编程实现来说更加方便。

.NET Framework由两部分构成:公共语言运行库(Common Language Runtime ,CLR)和Framework类库(Framework Class Library ,FCL)。CLR包括自己的文件加载器、垃圾收集器、安全系统等。CRL提供了一个可靠而完善的多语言运行环境。CLR是一个软件引擎,用于加载应用程序、检查错误、进行安全许可认证、执行和清空内存。Framework类库提供了所有应用程序模型都要使用的一个面向对象的API集合。.NET 基础类库的System.Threading命名空间提供了大量的类和接口来支持多线程。所有与多线程机制相关的类都存放在System.Threading命名空间中。其中Thread类用于创建及管理线程,ThreadPool类用于管理线程池等,此外还提供线程间通讯等实际问题的机制。

线程之间通信的两个基本问题是互斥和同步。

线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应该等待,直到消息到达时才被唤醒。

线程互斥是指对于共享资源,在各线程访问时的排它性。当有多个线程都要使用某一共享资源时,同一时刻只允许一个线程去使用,其它要使用该共享资源的线程必须等待,直到占用资源者释放该共享资源。

在WIN32中,同步机制主要有以下几种:

(1)全局变量;

(2)事件(Event);

(3)临界区(Critical section);

(4)互斥量(Mutex);

(5)信号量(Semaphore)。

Visual Studio调试器是一个功能十分强大的调试工具,通过它可以观察程序的运行状态并确定逻辑错误的位置。使用该调试器,可以中断(或挂起)程序的执行,便于检查代码,此外还可以计算和编辑程序中的变量,查看寄存器、从源代码创建的指令、以及应用程序所占用的内存空间。

VTune Performance Analyzer能收集并整理程序执行效率的相关数据,协助搜寻、找到程序执行速度的瓶颈点。使用VTune Performance Analyzer,通过调用图,可以看到应用中调用-被调用之间的关系,可以洞察CPU时间到底被消耗在什么地方;通过计数器监测器,可以检查代码的某一时间片和性能计数器的关系。Vtune Performance Analyzer和Microsoft Visual Studio集成开发环境可以紧密集成,同时支持命令行接口。

本章首先介绍了Windows平台下的线程库,包括Win32 线程库、MFC线程库以及.Net Framework线程库。然后重点介绍如何使用Win32 API来创建线程、管理线程以及如何实现线程间同步。我们还介绍了MFC以及.Net Framework进行多线程同步的方法。最后我们介绍如何使用调试工具对多线程程序进行调试。
然后对OpenMP进行了介绍。主要介绍OpenMP程序的一些历史概况以及当前的一些发展状况。介绍了共享内存和非共享内存的体系结构以及体系结构对编程的影响。在此基础上,通过一个简单的程序给出OpenMP的基本概况以及在Windows环境和Linux环境下如何编译和运行OpenMP程序。详细讲解OpenMP编程的各项技术,包括循环并行化、并行区域编程以及OpenMP程序的多线程同步问题。在循环并行化中,包括内容有如何进行循环并行化,如何根据不同的变量类型使用不同的编译导向子句,从而能够获得数据的并行化。初步引出循环优化的概念以及基本技术。在并行区域编程中,内容包括讲解parallel导向的真正含义,如何使用这个导向语句在多线程中共享工作,并行区域的嵌套,以及如何控制OpenMP程序并行化。OpenMP程序的多线程同步问题内容包括数据竞争的概念,互斥锁的同步机制,事件的同步机制等。本章还将通过一系列的例子来讲解OpenMP并行程序的一般优化方法。首先需要确定影响性能的主要因素,以及如何确定程序中负载最重的代码单元,如何针对这种情况进行并行优化。对于OpenMP程序来说,主要是进行并行化以及同步的优化过程,充分挖掘应用程序的并行化性质,发挥并行化的优势,消除同步对并行化程序的性能的不利因素以及在一定条件下通过消除同步互斥来提高程序的整体性能。其它的性能优化技术包括程序的区域性对程序性能的影响,区域性与并行循环调度的问题,错误共享对程序性能的影响以及消除,体系结构相关的一些优化方法等。

第五章 MKL数学函数库
主要介绍MKL在一些相关专业课上的应用,内容涵括了MKL的基本知识、框架、应用方法,如傅立叶变换等的应用。
第六章 多核软件开发工具
主要介绍一些使用的多核软件工具的作用及结合具体的实例讲解各工具结合Visual Studio的具体用法。
主要介绍了Intel C++编译器的主要功能与优点及结合实验代码进行了一些优化实验。包括:
·Vtune性能分析器功能与使用方法
·Thread Checker线程检查器功能与使用
·Thread Profiler线程档案器功能与使用
第七章 IPP程序设计
针对本专业重要研究方向-图像处理,专门设置IPP及OpenCV在多核平台上的应用。本章内容包括IPP的概念、编程技术、IPP函数、编程实例等。
第八章 MPI编程
本章主要针对本专业重要研究方向-计算机网络信息处理,专门设置通过集群方式进行网络数据包处理的应用实践内容。MPI是针对分布式存储方式的并行计算工具,通过集群内各台机器的协作以完成既定的计算任务。本章内容主要包括MPI的概念、历史、主要函数、安装方法、使用方法、实例等。

第九章 TBB编程

本章主要针对2008年发布Release版本的线程构建模块TBB的历史、优点、基本算法、编程实例进行讲解。

你可能感兴趣的:(武汉大学“多核架构及编程技术”精品课程理论教学)