多核程序设计all

上传人:壹****1 文档编号:567936433 上传时间:2024-07-22 格式:PPT 页数:127 大小:2.35MB
返回 下载 相关 举报
多核程序设计all_第1页
第1页 / 共127页
多核程序设计all_第2页
第2页 / 共127页
多核程序设计all_第3页
第3页 / 共127页
多核程序设计all_第4页
第4页 / 共127页
多核程序设计all_第5页
第5页 / 共127页
点击查看更多>>
资源描述

《多核程序设计all》由会员分享,可在线阅读,更多相关《多核程序设计all(127页珍藏版)》请在金锄头文库上搜索。

1、多核程序设计多核程序设计第一章第一章 多核技术导论多核技术导论2007年6月12日浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/微处理器发展史微处理器发展史p1945年,世界上第一台全自动电子数字计算机ENIACp计算机的发展按照硬件工艺可以分为n第一代(19461958):电子管数字计算机。n第二代(19581964):晶体管数字计算机。n第三代(19641971):集成电路数字计算机。n第四代(1971年以后):大规模集成电路数字计算机。p微处理器n第一代微处理器(4位):英特尔4004,8008n第二代微处理器(8位):采用NMOS工艺,采用汇编语言、BAS

2、IC、Fortran编程,使用单用户操作系统。如英特尔8080,8085。n第三代微处理器(16位):以1978年英特尔的8086出现为起点。n第四代微处理器(32位):运算模式包括实模式、保护模式和“虚拟86”。英特尔80386DX,80486,Pentium4浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/并行计算机并行计算机p由一组处理单元组成,这组处理单元通过相互之间的通信与协作,以更快的速度共同完成一项大规模的计算任务。p出现背景:n60年代初期,晶体管以及磁芯存储器的出现,处理单元变得越来越小,存储器也更加小巧和廉价。出现规模不大的共享存储多处理器系统,

3、即大型主机(Mainframe)。n60年代末期,同一个处理器开始设置多个功能相同的功能单元,流水线技术也出现了,在处理器内部的应用大大提高了并行计算机系统的性能。p两个最主要的组成部分n计算节点n节点间的通信与协作机制浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/并行计算机的弗林分类并行计算机的弗林分类pFlynn根据指令流和数据流的不同组织方式,把计算机系统的结构分为以下四类:n单指令流单数据流(SingleInstructionstreamSingleDatastream,SISD)n单指令流多数据流(SingleInstructionstreamMulti

4、pleDatastream,SIMD)n多指令流单数据流(MultipleInstructionstreamSingleDatastream,MISD)n多指令流多数据流(MultipleInstructionstreamMultipleDatastream,MISD)浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/并行计算机系统结构分类并行计算机系统结构分类p分布式存储器的SIMD处理机n含有多个同样结构的处理单元(PE),通过寻径网络以一定方式互相连接。每个PE有各自的本地存储器(LM)。p向量超级计算机(共享式存储器SIMD)n集中设置存储器,共享的多个并行存

5、储器通过对准网络与各处理单元PE相连。在处理单元数目不太大的情况下很理想。p对称多处理器(SMP)n一个计算机上汇集了一组处理器,各处理器之间共享内存子系统以及总线结构。p并行向量处理机(PVP)p集群计算机浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/片上多核处理器架构片上多核处理器架构p片上多核处理器(ChipMulti-Processor,CMP)就是将多个计算内核集成在一个处理器芯片中,从而提高计算能力。p按计算内核的对等与否,CMP可分为同构多核和异构多核pCPU核心数据共享与同步n总线共享Cache结构:每个CPU内核拥有共享的二级或三级Cache,用

6、于保存比较常用的数据,并通过连接核心的总线进行通信。n基于片上互连的结构:每个CPU核心具有独立的处理单元和Cache,各个CPU核心通过交叉开关或片上网络等方式连接在一起。p给程序开发者带来的挑战浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/芯片组对多核的支持芯片组对多核的支持固件固件p固件是一种嵌入到硬件设备中的软件。它通常烧写在flash等介质中,可以被当作一个二进制映像文件由用户从硬件设备中调用。p固件是在集成电路只读存储器中的计算机程序,是可擦写可编程芯片,其上的程序可以通过专门的外部硬件进行修改,但是不能被一般的应用程序改动。浙浙 江江 大大 学学 英

7、英 特特 尔尔 技技 术术 中中 心心http:/芯片组对多核的支持芯片组对多核的支持固件固件(续续)pBIOS(BasicInput/OutputSystem)n作为系统硬件和操作系统之间的抽象层,主要用来初始化和配置系统的硬件,启动操作系统以及提供对系统设备底层的通讯。nBIOS是连接CPU、芯片组和操作系统的固件,是IBM兼容计算机中启动时调用的固件代码。n由两部分组成:上电自举即POST(Power On Self Test)和在线的中断服务(主要由legacy 操作系统使用)。n计算机加电时BIOS从flash、PROM或是EPROM中启动并完成初始化,进行加电自检,对硬盘,内存,显

8、卡,主板等硬件进行扫描检查,然后它将自己从BIOS内存空间中解压到系统的内存空间中,并开始从那里运行。n正在被以EFI(Extensible Firmware Interface,可扩展固件接口)为代表的新一代技术所取代。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/芯片组对多核的支持芯片组对多核的支持固件固件(续续2)pEFI(可扩展固件接口)n在操作系统与平台固件之间的软件接口。nEFI规范定义的接口包括包含平台信息的数据表和启动时及启动后的服务。nEFI启动管理器被用来选择装载操作系统,不再需要专门的启动装载器机制辅助。nFramework是一种固件的架构,

9、它是EFI固件接口的一种实现,用来完全替代传统的BIOS。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/EFI对多核支持对多核支持p在Framework中定义了两类处理器nBSP(bootstrapprocessor),执行EFI的初始化代码,设置APIC环境,建立系统范围的数据结构,开始并初始化AP。nAP(applicationprocessor),在系统上电或重启之后,AP会自己进行一个简单的设置,然后就等待BSP发出Startup信号。pFramework在多核计算机中初始化过程如下:nSEC:从实模式切换到保护模式,处理不同的重启事件、对每个处理器进行缓

10、存设置。nPEI:做尽量少的硬件初始化,而把更多的留给DXE。nDXE:对所有可用的硬件设备进行初始化,为建立控制台和启动操作系统提供必要的服务。nBDS:建立所需的控制台设备,在输出控制台上显示用户界面。p当系统最后选择启动到操作系统时,EFI需要提交包括处理器在内的有关信息。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/操作系统对多核处理器的支持方法操作系统对多核处理器的支持方法p调度与中断n对任务的分配进行优化。使同一应用程序的任务尽量在一个核上执行。n对任务的共享数据优化。由于CMP体系结构共享二级缓存,可以考虑改变任务在内存中的数据分布,使任务在执行时尽

11、量增加二级缓存的命中率。n对任务的负载均衡优化。当任务在调度时,出现了负载不均衡,考虑将较忙处理器中与其他任务最不相关的任务迁移,以达到数据的冲突量小。p输入输出系统p存储管理与文件系统p虚拟化技术n平台虚拟化n资源虚拟化多核程序设计多核程序设计第二章第二章 并行计算基础并行计算基础2007年6月12日浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/并行计算机体系结构并行计算机体系结构p组成并行计算机的各个部分:n节点(node)n互联网络(interconnectnetwork)n内存(memory)内存模块与节点分离内存模块位于节点内部浙浙 江江 大大 学学 英

12、英 特特 尔尔 技技 术术 中中 心心http:/多级存储体系结构多级存储体系结构p为了解决内存墙(memorywall)性能瓶颈问题。p在节点内部的cache称为二级cache(L2cache)。p在处理器内部更小的cache成为一级cache(L1cache)。pL1cache连接CPU寄存器和L2cache,负责缓存L2cache中的数据到寄存器中。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/多级存储体系结构多级存储体系结构(续续)pcache的映射策略指的是内存块和cache线之间如何建立相互映射关系。p直接映射策略(directmappingstrat

13、egy)n每个内存块只能被唯一的映射到一条cache线中pK路组关联映射策略(K-waysetassociationmappingstrategy)nCache被分解为V个组,每个组由K条cache线组成,内存块按直接映射策略映射到某个组,但在该组中,内存块可以被映射到任意一条cache线。p全关联映射策略(fullassociationmappingstrategy)n内存块可以被映射到cache中的任意一条cache线。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/并行计算机访存模型并行计算机访存模型pUMA(UniformMemoryAccess)模型n物理

14、存储器被所有节点共享;n所有节点访问任意存储单元的时间相同;n发生访存竞争时,仲裁策略平等对待每个节点,即每个节点机会均等;n各节点的CPU可带有局部私有高速缓存;n外围I/O设备也可以共享,且每个节点有平等的访问权利。pNUMA(Non-UniformMemoryAccess)模型n物理存储器被所有节点共享,任意节点可以直接访问任意内存模块;n节点访问内存模块的速度不同,访问本地存储模块的速度一般是访问其他节点内存模块的3倍以上;n发生访存竞争时,仲裁策略对节点可能是不等价的;n各节点的CPU可带有局部私有高速缓存(cache);n外围I/O设备也可以共享,但对各节点是不等价的。浙浙 江江

15、大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/并行计算机访存模型并行计算机访存模型(续续)pCOMA(Cache-OnlyMemoryAccess)模型n各处理器节点中没有存储层次结构,全部高速缓存组成了全局地址空间n利用分布的高速缓存目录D进行远程高速缓存的访问nCOMA中的高速缓存容量一般都大于2级高速缓存容量n使用COMA时,数据开始时可以任意分配,因为在运行时它最终会被迁移到要用到它的地方pNORMA(No-RemoteMemoryAccess)模型n所有存储器都是私有的;n绝大多数NORMA都不支持远程存储器的访问;n在DSM中,NORMA就消失了。浙浙 江江 大大

16、 学学 英英 特特 尔尔 技技 术术 中中 心心http:/并行计算机访存模型并行计算机访存模型(续续2)p并行计算机系统的不同访存模型分类浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/并行计算模型并行计算模型pSIMD同步并行计算模型n共享存储的SIMD模型(PRAM模型)n分布存储的SIMD模型(SIMD互联网络模型)pMIMD异步并行计算模型n异步PRAM模型nBSP模型nLogP模型nC3模型浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/SIMD同步并行计算模型同步并行计算模型pSIMD共享存储模型(PRAM模型)nPRAM-

17、EREW (Exclusive-Read and Exclusive-Write),不允许同时读和同时写nPRAM-CREW (Concurrent-Read and Exclusive-Write) ,允许同时读但不允许同时写nPRAM-CRCW (Concurrent-Read and Concurrent-Write) ,允许同时读和同时写p优点:n适合于并行算法的表达、分析和比较;n使用简单,很多诸如处理器间通信、存储管理和进程同步等并行计算机的低级细节均隐含于模型中;n易于设计算法和稍加修改便可运行在不同的并行计算机上;n且有可能加入一些诸如同步和通信等需要考虑的方面。浙浙 江江 大

18、大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/SIMD分布存储模型分布存储模型p采用一维线性连接的SIMD模型,简记为SIMD-LCp采用网孔连接的SIMD模型,简记为SIMD-MCp采用树形连接的SIMD模型,简记为SIMD-TCp采用树网连接的SIMD模型,简记为SIMD-MTp采用立方连接的SIMD模型,简记为SIMD-CCp采用立方环连接的SIMD模型,简记为SIMD-CCCp采用洗牌交换连接的SIMD模型,简记为SIMD-SEp采用蝶形连接的SIMD模型,简介为SIMD-BFp采用多级互联网络连接的SIMD模型,简记为SIMD-MIN浙浙 江江 大大 学学 英英 特特

19、 尔尔 技技 术术 中中 心心http:/MIMD异步计算模型异步计算模型PRAM模型模型pAPRAM特点:n每个处理器都有其本地存储器、局部时钟和局部程序n处理器间的通信经过共享全局存储器n无全局时钟,各处理器异步地独立执行各自的指令n处理器任何时间依赖关系需明确地在各处理器的程序中加入同步(路)障(SynchronizationBarrier)n一条指令可在非确定但有限的时间内完成。pAPRAM模型中有四类指令:n全局读,将全局存储单元中的内容读入本地存储器单元中n局部操作,对本地存储器中的数执行操作,其结果存入本地存储器中n全局写,将本地存储器单元中的内容写入全本地存储器单元中n同步,同

20、步是计算中的一个逻辑点,在该点各处理器均需等待别的处理器到达后才能继续执行其局部程序浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/MIMD异步计算模型异步计算模型BSP模型模型p作为计算机语言和体系结构之间的桥梁,由以下述三个参数描述分布存储的并行计算机模型:n处理器/存储器模块(下文简称处理器)n处理器模块之间点到点信息传递的路由器n执行以时间间隔L为周期的路障同步器p特点:n将处理器和路由器分开,强调了计算任务和通信任务的分开,而路由器仅施行点到点的消息传递,不提供组合、复制或广播等功能,这样做既掩盖了具体的互联网络拓扑,又简化了通信协议n采用路障方式的以硬件

21、实现的全局同步是在可控的粗粒度级,从而提供了执行紧耦合同步式并行算法的有效方式,而程序员并无过分的负担n在分析BSP模型的性能时,假定局部操作可在一个时间步内完成,而在每一超级步中,一个处理器至多发送或接受h条消息(h-relation)浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/MIMD异步计算模型异步计算模型LogP,C3模型模型pLogP模型是一种分布存储的、点到点通信的多处理机模型,其中通信网络由一组参数来描述,但它并不涉及到具体的网络结构,也不假定算法一定要用显式的消息传递操作进行描述。pC3(Computation,Communication,Con

22、gestion)模型是一个与体系结构无关的粗粒度的并行计算模型,旨在能反映计算复杂度,通信模式和通信期间潜在的拥挤等因素对粗粒度网络算法的影响。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/进程进程p可表示成四元组(P,C,D,S),其中P是程序代码,C是进程的控制状态,D是进程的数据,S是进程的执行状态。p两个特征:n资源特征,包括程序执行所必需的计算资源,例如程序代码、内存地址空间、文件系统、I/O设备、程序计数器、寄存器、栈空间等n执行特征,包括在进程执行过程中动态改变的特征,例如指令路径(即进程执行的指令序列)、进程的控制与执行状态等。p状态:n非存在状态

23、:进程依赖的程序还没有投入运行;n就绪状态:进程由其父进程(例如,操作系统的内核进程或shell进程,或其他应用程序进程)调入并准备运行;n运行状态:进程占有CPU和其他必须的计算资源,并执行指令;n挂起状态:由于CPU或其他必须的计算资源被其他进程占有,或必须等待某类事件的发生,进程转入挂起状态,以后一旦条件满足,由操作系统唤醒并转入就绪状态;n退出状态:进程正常结束或因异常退出而被废弃浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/进程间通信进程间通信p现代操作系统提供基本的系统调用函数,允许位于同一台处理机或不同处理机的多个进程之间相互交流信息p三种表现形式:

24、n通信:进程间的数据传递称为进程间通信。n同步:同步是使位于相同或不同处理机中的多个进程之间相互等待的操作,它要求进程的所有操作均必须等待到达某个控制状态之后才进行。n聚集(或规约):聚集将位于相同或不同处理机中的多个进程的局部结果综合起来,通过某种操作,产生一个新的结果,存储在某个指定的或者所有的进程的变量中。p具体实现:n在共享存储环境中,通过读/写操作系统通过的共享数据缓存区来实现n在分布式存储网络环境中,通过网络通信来实现浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/线程线程p进程不适合细粒度的共享存储并行程序设计。p线程(threads)又被称作轻量级进

25、程。p进程可由单个线程来执行,即通常所说的串行执行;或者,进程也可由多个线程来并行执行,此时,多个线程将共享该进程的所有资源特征,并可以使用不同的CPU,对不同的数据进行处理,从而达到提高进程执行速度的目的。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/并行编程环境并行编程环境p比较流行的并行编程环境主要有3类:消息传递、共享存储和数据并行特征特征消息传递消息传递共享存储共享存储数据并行数据并行典型代表MPI,PVMOpenMPHPF可移植性所有主流并行计算机SMP,DSMSMP,DSM,MPP并行粒度进程级大粒度线程级细粒度进程级细粒度并行操作方式异步异步松散同

26、步数据存储模式分布式存储共享存储共享存储数据分配方式显式隐式半隐式学习入门难度较难容易偏易可扩展性好较差一般浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/编程语言与编译器编程语言与编译器p自动并行pHPF:数据并行编程nHPF提供了注释形式的指令来扩展变量类型的说明,能够对数组的数据布局进行相当详细的控制。pOpenMP:共享存储并行编程浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/并行计算性能评测并行计算性能评测p并行程序执行时间n等于从并行程序开始执行到所有进程执行完毕,墙上时钟走过的时间,也称为墙上时间(wallclocktim

27、e)。对各个进程,墙上时间可进一步分解为计算CPU时间、通信CPU时间、同步开销时间、同步导致的进程空闲时间。p加速比性能定律nAmdahl定律nGustafson定律nSun和Ni定律p并行程序性能评价方法n浮点峰值性能与实际浮点性能n数值效率和并行效率浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/程序性能优化程序性能优化p串行程序性能优化n调用高性能库,比如优化的BLAS,FFTW等n选择适当的编译器优化选项n合理定义数组维数n注意嵌套循环的顺序,尽量改善数据访问的局部性n循环展开p并行程序性能优化n减少通信量、提高通信粒度n全局通信尽量利用高效集合通信算法n

28、挖掘算法的并行度,减少CPU空闲等待n负载平衡n通信、计算的重叠n通过引入重复计算来减少通信,即以计算换通信浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/常用并行数值算法常用并行数值算法p假设算法针对的是一台有p个处理机的并行系统,每个处理机上运行一个进程,Pj表示第j个处理机或进程,Pmyid表示当前的处理机或进程,send(x,j)和recv(x,j)分别表示在Pmyid中把x传送到Pj和从Pj中接收x,此外,用i mod p表示i对i取模运算。p通常采用的是矩阵在处理机阵列按卷帘方式存放。设分块矩阵是88,处理机阵列是32,则矩阵的存放方式如下:浙浙 江江

29、大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/常用并行数值算法常用并行数值算法行矩阵乘法行矩阵乘法pC=ABp串行矩阵乘法串行矩阵乘积子程序(i-j-k形式)DOI=1,MDOJ=1,LDOK=1,NC(I,J)=C(I,J)+A(I,K)*B(K,J)ENDDOENDDOENDDO串行矩阵乘积子程序(j-k-i形式)DOJ=1,LDOK=1,NDOI=1,MC(I,J)=C(I,J)+A(I,K)*B(K,J)ENDDOENDDOENDDO浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/常用并行数值算法常用并行数值算法行矩阵乘法行矩阵乘法p行列划

30、分算法p行行划分算法pCannon算法浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/并行编译器并行编译器p并行编译过程浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/并行编译器并行编译器p流分析p代码优化n代码向量化(CodeVectorization):把标量程序中的由一种可向量化循环完成的操作变换成向量操作。n代码并行化(CodeParallelization):并行代码的优化是将一个程序展开成多线程以同时供多台处理机并行执行,其目的是要减少总的执行时间。p代码生成n并行代码生成(CodeGeneration)涉及到将优化后的中间形

31、式的代码转换程可执行的具体的机器目标代码。包括执行次序、指令选择、寄存器分配、负载平衡、并行粒度、代码调度以及后优化(Postoptimization)等问题。多核程序设计多核程序设计第三章第三章 线程的基本概念线程的基本概念2007年6月12日浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/多线程的概念多线程的概念p线程(thread)是进程上下文(context)中执行的代码序列,又被称为轻量级进程(lightweightprocess)p在支持多线程的系统中,进程成为资源分配和保护的实体,而线程是被调度执行的基本单元。浙浙 江江 大大 学学 英英 特特 尔尔

32、技技 术术 中中 心心http:/用户级线程和内核级线程用户级线程和内核级线程p用户级线程库n是用于用户级线程管理的例程包,支持线程的创建、终止,以及调度线程的执行并保存和恢复线程的上下文,这些操作都在用户空间进行,无需内核的支持。p内核级线程n所有管理操作都是由操作系统内核完成的。内核保存线程的状态和上下文信息,当一个线程执行了引起阻塞的系统调用时,内核可以调度该进程的其他线程执行。在多处理器系统上,内核可以分派属于同一进程的多个线程在多个处理器上运行,提高进程执行的并行度。p组合模式n有的操作系统提供了组和的线程模式,在Solaris中,用户创建的多个用户级线程被映射到一些内核线程上,内核

33、线程的数目可能少于用户级线程的数目。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/多线程的映射模型多线程的映射模型p对于实现了用户级线程和内核级线程的操作系统,用户级线程和内核级线程之间的可以有不同的映射方式。p多对一模型n多对一模型把多个用户级线程映射到一个内核级线程。n线程的管理在用户空间实现,所以效率高。n当一个线程因调用系统调用被阻塞时,整个进程被阻塞。p一对一模型n一对一模型把每个用户级线程影射到一个内核级线程。n当一个线程阻塞时,其他线程仍然可以运行。p多对多模型n多对多模型将m个用户级线程影射到n个内核级线程,mn。n用户可以创建所需要的用户级线程,

34、通过分配适当数目的内核级线程获得并发执行的优势并节省系统资源。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/线程的生命周期线程的生命周期p线程的标识p线程的创建p线程的终止p线程的状态n就绪(ready):线程等待可用的处理器。n运行(running):线程正在被执行。n阻塞(blocked):线程正在等待某个事件的发生(比如I/O的完成,试图加锁一个被上锁的互斥量)。n终止(terminated):线程从起始函数中返回或者调用pthread_exit。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/线程的同步线程的同步p由于线程共享同

35、一进程的内存空间,多个线程可能需要同时访问同一个数据。如果没有正确的保护措施,对共享数据的访问会造成数据的不一致和错误。p常用的同步机制:n临界区(criticalsection)n信号量(simphore)n互斥量(mutex)n管程(monitor)p锁的粒度p死锁多核程序设计多核程序设计第四章第四章 Windows多线程编程及调优多线程编程及调优2007年6月12日浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/Windows线程库介绍线程库介绍pWin32API是Windows操作系统为内核以及应用程序之间提供的接口,将内核提供的功能进行函数封装,应用程序通

36、过调用相关的函数获得相应的系统功能。pMFC是微软基础函数类库(MicrosoftFoundationClasses),由微软提供的,用类库的方式将Win32API进行封装,以类的方式提供给开发者。p.NETFramework由两部分构成:公共语言运行库(CommonLanguageRuntime,CLR)和Framework类库(FrameworkClassLibrary,FCL)。.NET基础类库的System.Threading命名空间提供了大量的类和接口来支持多线程。所有与多线程机制相关的类都存放在System.Threading命名空间中。浙浙 江江 大大 学学 英英 特特 尔尔 技

37、技 术术 中中 心心http:/使用使用win32线程线程APIpWin32函数库中提供了操作多线程的函数,包括创建线程、管理线程、终止线程、线程同步等接口。p线程函数nDWORDWINAPIThreadFunc(LPVOIDlpvThreadParm);p线程创建HANDLECreateThread(LPSECURITY_ATTRIBUTESlpThreadAttributes,SIZE_TdwStackSize,LPTHREAD_START_ROUTINElpStartAddress,LPVOIDlpParameter,DWORDdwCreationFlags,LPDWORDlpThrea

38、dId);浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/线程管理线程管理p设置置线程的程的优先先级n线程优先级=进程优先级+线程相对优先级nBoolSetThreadPriority(HANDLEhPriority,intnPriority)p线程的挂起与恢复程的挂起与恢复n进程中的每个线程都有挂起计数器(suspendcount)。当挂起计数器值为0时,线程被执行;当挂起计数器值大于0时,调度器不去调度该线程。nDWORDSuspendThread(HANDLEhThread);nDWORDResumeThread(HANDLEhThread);p线程等待程等待

39、 n一组能使线程阻塞其自身执行的等待函数WaitForSingleObject、WaitForMultipleObject。p线程程终结浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/Win32多线程的实现多线程的实现p下面这个程序首先创建两个线程,当输入为1时,执行线程,否则挂起线程。#include#includeusingnamespacestd;DWORDWINAPIFunOne(LPVOIDparam)while(true)Sleep(1000);couthello!;return0;DWORDWINAPIFunTwo(LPVOIDparam)while(

40、true)Sleep(1000);coutinput;if(input=1)ResumeThread(hand1);ResumeThread(hand2);elseSuspendThread(hand1);SuspendThread(hand2);TerminateThread(hand1,1);TerminateThread(hand2,1);return0;浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/线程执行和资源存取线程执行和资源存取p线程之间通信的两个基本问题是互斥和同步n线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它

41、没有得到另一个线程的消息时应该等待,直到消息到达时才被唤醒。n线程互斥是指对于共享资源,在各线程访问时的排它性。pWin32线程同步的实现n全局变量n事件(Event)n临界区(Criticalsection)n互斥量(Mutex)n信号量(Semaphore)浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/Win32线程同步的实现线程同步的实现p全局变量n进程中的所有线程均可以访问所有的全局变量,因而全局变量成为Win32多线程通信的最简单方式。p事件n事件(Event)是WIN32提供的最灵活的线程间同步方式。n事件存在两种状态:p激发状态(signaledor

42、true)p未激发状态(unsignalorfalse)n事件可分为两类:p手动设置:这种对象只能用程序来手动设置,在需要该事件或者事件发生时,采用SetEvent及ResetEvent来进行设置。p自动恢复:一旦事件发生并被处理后,自动恢复到没有事件状态,不需要再次设置。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/Win32线程同步的实现线程同步的实现(续续)p临界区n一种防止多个线程同时执行一个特定代码段的机制n适用于多个线程操作之间没有先后顺序但要求互斥的同步。多个线程访问同一个临界区的原则:p一次最多只能一个线程停留在临界区内p不能让一个线程无限地停留在

43、临界区内,否则其他线程将不能进入该临界区p互斥量n通常用于协调多个线程或进程的活动,通过“锁定”和“取消锁定”资源,控制对共享资源的访问。p信号量n信号量是一个核心对象,拥有一个计数器,可用来管理大量有限的系统资源。当计数值大于零时,信号量为有信号状态;当计数值为零时,信号量处于无信号状态。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/MFC线程同步的实现线程同步的实现pAfxBeginThread()来创建一个CWinThread对象。CWinThread:CreateThread()函数用来启动新的线程pMFC同步类nCCriticalSection只允许当前

44、进程中的一个线程访问某个对象的同步类nCMutes只允许系统中一个进程内的一个线程访问某个对象的同步类nCSymaphore只允许一到某个指定数目个线程同时访问某个对象的同步类nCEvent当某个事件发生时通知一个应用程序的同步类浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/.Net Framework线程同步的实现线程同步的实现p创建辅助(或从属)线程的第一个步骤是创建ThreadStart代理,指定要由该线程执行的线程函数。然后将ThreadStart代理传递给Thread类的构造函数。nThreadStartstarter=newThreadStart(My

45、Function);Threadt=newThread(starter);t.Start();p线程创建好后,可以使用Thread类下的方法对线程进行控制:p.NETframework提供了很多的类和数据类型来控制对共享资源的访问。Resume 继续已挂起的线程。 Sleep 已重载。 将当前线程阻塞指定的毫秒数。 Suspend 挂起线程,或者如果线程已挂起,则不起作用。 Abort 调用此方法通常会终止线程。 多核程序设计多核程序设计第五章第五章 Linux 多线程编程多线程编程2007年6月12日浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/POSIX 线程

46、库线程库Pthreads介绍介绍pIEEEPOSIX标准p1003.1c(Pthreads)定义了处理线程的一系列C语言类型的API。p在Linux中,线程一般被认为是“轻量级的进程”。pLinux创建进程所使用的函数是fork()或者vfork()。而对线程的创建和管理Linux可以使用POSIX的线程库pthreads提供的APIs。p使用fork()创建进程和使用POSIX线程库差别:n使用fork()创建进程的特点:p代价昂贵,通常子进程需要拷贝父进程的整个上下文,比如数据等。p进程间的通信方式比较复杂,比如使用管道、消息、共享内存等方法。p操作系统在实现进程间的切换比线程切换更费时。

47、n使用POSIXpthreads库创建线程的特点:p线程可使用存在于进程中的资源,因此创建进程比创建线程更快。p线程间的通信方式更容易,比如通过进程中的变量,可以让多个线程共享数据。p操作系统对线程的切换比对进程的切换更容易和快速。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/POSIX pthreads库库p线程的创建npthreads线程库中提供的创建线程的函数是pthread_create()#includeintpthread_create(pthread_t*thread,pthread_attr_t*attr,void*(*start_routine)

48、(void*),void*arg);p线程的退出n在线程的处理函数中,可以显示的调用pthread_exit()结束线程执行,也可以不调用pthread_exit(),而只是让线程处理程序返回。n除了pthread_exit()函数,可以让当前调用pthread_exit()的线程显示地退出外,线程也可以使用pthread_cancel()函数终止其他线程的执行。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/POSIX pthreads库库(续续)p等待线程结束npthread_join()函数会挂起创建线程的线程的执行,直到等待到想要等待的子线程。intpthr

49、ead_join(pthread_tth,void*thread_return);p线程的分离n主线程创建子线程,且子线程本身自己有自我回收内存资源的能力。intpthread_detach(pthread_tth);p获得当前线程标志n使用pthread_self()函数可以获得当前线程的标志,pthread_self()的返回值就是当前线程的标志。pthread_tpthread_self(void);浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/使用使用Pthreads编写的程序例子编写的程序例子#include#include#include#includ

50、e#defineTHREAD_NUMBER2intretval_hello1=2,retval_hello2=3;void*hello1(void*arg)char*hello_str=(char*)arg;sleep(1);printf(%sn,hello_str);pthread_exit(&retval_hello1);void*hello2(void*arg)char*hello_str=(char*)arg;sleep(2);printf(%sn,hello_str);pthread_exit(&retval_hello2);浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中

51、 心心http:/使用使用Pthreads编写的程序例子编写的程序例子(续续)intmain(intargc,char*argv)inti;intret_val;int*retval_hello2;pthread_tptTHREAD_NUMBER;constchar*argTHREAD_NUMBER;arg0=helloworldfromthread1;arg1=helloworldfromthread2;printf(Begintocreatethreads.n);ret_val=pthread_create(&pt0,NULL,hello1,(void*)arg0);if(ret_val!

52、=0)printf(pthread_createerror!n);exit(1);浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/使用使用Pthreads编写的程序例子编写的程序例子(续续2)ret_val=pthread_create(&pt1,NULL,hello2,(void*)arg1);if(ret_val!=0)printf(pthread_createerror!n);exit(1);printf(Now,themainthreadreturns.n);printf(Begintowaitforthreads.n);for(i=0;iTHREAD_NU

53、MBER;i+)ret_val=pthread_join(pti,(void*)&retval_helloi);if(ret_val!=0)printf(pthread_joinerror!n);exit(1);elseprintf(returnvalueis%dn,*retval_helloi);return0;浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/线程的属性线程的属性属性名属性名意意义 detachstate选择被创建的线程是处于可加入的状态还是分离状态。可加入状态值是PTHREAD_CREATE_JOINABLE;分离状态值是PTHREAD_CREA

54、TE_DETACHED。缺省状态值是PTHREAD_CREATE_JOINABLE。pthread_attr_setdetachstate()可设置线程为加入或者分离状态;pthread_attr_getdetachstate()可以获得当前线程是否是加入的或者是分离的状态。schedpolicy为被创建的线程选择调度策略。被创建的线程的状态可以是SCHED_OTHER(一般的,非实时调度)、SCHED_RR(实时,轮转调度)或者SCHED_FIFO(实时,先进先出调度)。缺省值是SCHED_OTHER。实时调度SCHED_RR 和 SCHED_FIFO 只能用于有超级用户权限的进程使用。 p

55、thread_attr_setschedpolicy() 和 pthread_attr_getschedpolicy() 函数可以设置和获得线程的调度属性。 schedparam为被创建的线程选择调度参数。这里的调度参数指的是线程的调度优先级。缺省优先级是0。这个属性对于SCHED_OTHER是不重要的;它只对SCHED_RR和SCHED_FIFO两个和实时调度相关的调度方式有效。pthread_attr_setschedparam()和pthread_attr_getschedparam()两个函数可以分别对线程的优先级进行设置和获取。 inheritsched选择对新创建的线程的调度策略和

56、调度参数是否被schedpolicy 和schedparam 属性决定(这时的值是PTHREAD_EXPLICIT_SCHED)或者是通过父线程继承而得到的(这时的值是PTHREAD_INHERIT_SCHED)。缺省的值是PTHREAD_EXPLICIT_SCHED。 scope为选择被创建的线程调度竞争范围。缺省值是PTHREAD_SCOPE_SYSTEM,表示线程和系统的所有的其他运行在CPU上的进程争夺CPU资源。如果是PTHREAD_SCOPE_PROCESS,表示调度的竞争只发生在运行于同一进程空间的线程之间,线程的优先级只在同一进程空间的线程之间有效,和其他进程无关。浙浙 江江

57、大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/线程互斥和同步线程互斥和同步Mutexp原子性。对mutex的加锁和解锁操作是原子的,一个线程进行mutex操作的过程中,其他线程不能对同一个mutex进行其他操作。p单一性。拥有mutex的线程除非释放mutex,否则其他线程不能拥有此mutex。p非忙等待。等待mutex的线程处于等待状态,直到要等待的mutex处于未加锁状态,这时操作系统负责唤醒等待此mutex的线程。pPOSIX线程库对mutex提供了以下函数进行操作:intpthread_mutex_init(pthread_mutex_t*mutex,constpth

58、read_mutexattr_t*mutexattr);intpthread_mutex_lock(pthread_mutex_t*mutex);intpthread_mutex_trylock(pthread_mutex_t*mutex);、intpthread_mutex_unlock(pthread_mutex_t*mutex);intpthread_mutex_destroy(pthread_mutex_t*mutex);浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/线程互斥和同步线程互斥和同步条件变量条件变量p条件标量是线程的同步设备。在线程间使用条件变

59、量可以使得一个线程在执行过程中,因满足某个条件而发出信号通知另一个线程;而另一个线程可以处于挂起状态,等待某个条件的满足后,才继续执行。p条件变量必须和mutex一起使用来避免竞争情况。pthread_cond_tcond=PTHREAD_COND_INITIALIZER;intpthread_cond_init(pthread_cond_t*cond,pthread_condattr_t*cond_attr);intpthread_cond_signal(pthread_cond_t*cond);intpthread_cond_broadcast(pthread_cond_t*cond);i

60、ntpthread_cond_wait(pthread_cond_t*cond,pthread_mutex_t*mutex);intpthread_cond_timedwait(pthread_cond_t*cond,pthread_mutex_t*mutex,conststructtimespec*abstime);intpthread_cond_destroy(pthread_cond_t*cond);浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/线程的撤销线程的撤销p一个线程可以通过向另个线程发送“请求”来结束另一个线程的执行。pPOSIXpthreads库

61、中关于撤销操作的函数有: nintpthread_setcancelstate(intstate,int*oldstate);nintpthread_setcanceltype(inttype,int*oldtype);nvoidpthread_testcancel(void);p在撤销线程的时候,可以编写程序让线程进一步进行所谓的“清理”工作,比如已经拥有了某个mutex,在清理例程中可以释放这个mutex;如果动态分配了内存,那么可以在清理例程中释放动态分配的内存。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/POSIX 信号量信号量pPOSIX信号量在多线程

62、编程中可以起到同步或互斥的作用。用POSIX信号量可以实现传统操作系统P、V操作。p由于POSIX信号量不是内核负责维护,所以当进程退出后,POSIX信号量自动消亡。#includeintsem_init(sem_t*sem,intpshared,unsignedintvalue);intsem_wait(sem_t*sem);intsem_trywait(sem_t*sem);intsem_post(sem_t*sem);intsem_getvalue(sem_t*sem,int*sval);intsem_destroy(sem_t*sem);浙浙 江江 大大 学学 英英 特特 尔尔 技技

63、术术 中中 心心http:/线程和信号处理线程和信号处理p#includepintpthread_sigmask(inthow,constsigset_t*newmask,sigset_t*oldmask);n用来改变或者设置线程的信号屏蔽(signalmask),newmask用来执行新的信号屏蔽,设置新信号屏蔽以前的信号屏蔽被存放到oldmask指向的位置。pintpthread_kill(pthread_tthread,intsigno);n可以向其他线程发送信号。pintsigwait(constsigset_t*set,int*sig);n挂起调用sigwait()的线程,直到收到第

64、一个参数set指向的信号集中指定的信号,且等待到信号被存放到第二个参数sig指向的位置。多核程序设计多核程序设计第六章第六章 OpenMP多线程编程及性能优化多线程编程及性能优化2007年6月12日浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/OpenMP编程简介编程简介p一种面向共享内存以及分布式共享内存的多处理器多线程并行编程语言。p一种能够被用于显示指导多线程、共享内存并行的应用程序编程接口(API)。pOpenMP具有良好的可移植性,支持多种编程语言pOpenMP能够支持多种平台,包括大多数的类UNIX系统以及WindowsNT系统(Windows2000

65、,WindowsXP,WindowsVista等)。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/OpenMP多线程编程基础多线程编程基础pOpenMP的编程模型以线程为基础,通过编译指导语句来显示地指导并行化,为编程人员提供了对并行化的完整的控制。p采用Fork-Join的形式MasterThreadParalllRegionNestedParallelRegion浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/OpenMP多线程编程基础多线程编程基础(续续)p编译指导语句n在编译器编译程序的时候,会识别特定的注释,而这些特定的注释就

66、包含着OpenMP程序的一些语义。#pragmaompclause,clause其中directive部分就包含了具体的编译指导语句,包括parallel,for,parallelfor,section,sections,single,master,critical,flush,ordered和atomic。n将串行的程序逐步地改造成一个并行程序,达到增量更新程序的目的,减少程序编写人员一定的负担。p运行时库函数nOpenMP运行时函数库原本用以设置和获取执行环境相关的信息,它们当中也包含一系列用以同步的API。n支持运行时对并行环境的改变和优化,给编程人员足够的灵活性来控制运行时的程序运行状

67、况。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/使用使用Visual Studio 2005编写编写OpenMP程序程序p当前的VisualStudio.Net2005完全支持OpenMP2.0标准,通过新的编译器选项/openmp来支持OpenMP程序的编译和链接。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/使用使用使用使用Visual Studio 2005Visual Studio 2005编写编写编写编写OpenMPOpenMP程序程序程序程序( (续续续续) )#include“stdafx.h”#include“omp

68、.h”int_tmain(intargc,_TCHAR*argv)printf(“Hellofromserial.n”);printf(“Threadnumber=%dn”,omp_get_thread_num();/串行执行#pragmaompparallel/开始并行执行printf(“Hellofromparallel.Threadnumber=%dn”,omp_get_thread_num();printf(“Hellofromserialagain.n”);return0;浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/使用使用使用使用Visual Stu

69、dio 2005Visual Studio 2005编写编写编写编写OpenMPOpenMP程序程序程序程序( (续续续续2)2)pOpenMP程序使用到的环境变量OMP_NUM_THREADS设置为4p三次执行的结果浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/OpenMP编程技术编程技术循环并行化循环并行化p循环并行化编译指导语句的格式#pragmaompparallelforclauseclausefor(index=first;test_expression;increment_expr)bodyoftheloop;p循环并行化语句的限制n循环并行化的语句

70、必须具有如下的形式for(index=start;indexend;increment_expr)n循环语句块应该是单出口与单入口的p循环嵌套n循环并行化编译指导语句可以加在任意一个循环之前,则对应的最近的循环语句被并行化,其他部分保持不变。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/OpenMP编程技术编程技术并行区域编程并行区域编程p通过循环并行化编译指导语句使得一段代码能够在多个线程内部同时执行。p并行区域编译指导语句的格式与使用限制#pragmaompparallelclauseclauseblockpparallel编译指导语句的执行过程#pragma

71、ompparallelfor(inti=0;i5;i+)printf(helloworldi=%dn,i);程序的执行结果:helloworldi=0helloworldi=1helloworldi=2helloworldi=3helloworldi=4#pragmaompparallelforfor(inti=0;i5;i+)printf(helloworldi=%dn,i);程序的执行结果:helloworldi=0helloworldi=3helloworldi=1helloworldi=4helloworldi=2浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http

72、:/OpenMP编程技术编程技术并行区域编程并行区域编程(续续)p线程私有数据与threadprivate,copyin子句n使用threadprivate子句用来标明某一个变量是线程私有数据,在程序运行的过程中,不能够被其他线程访问到。n使用copyin子句对线程私有的全局变量进行初始化。intcounter=0;/using threadprivate#pragma omp threadprivate(counter)voidinc_counter()counter+;int_tmain(intargc,TCHAR*argv)#pragmaompparallelfor(inti=0;i10

73、000;i+)inc_counter();printf(counter=%dn,counter);intglobal=0;#pragma omp threadprivate(global)int_tmain(intargc,TCHAR*argv)global=1000;#pragmaompparallelcopyin(global)printf(global=%dn,global);global=omp_get_thread_num();printf(global=%dn,global);printf(parallelagainn);#pragmaompparallelprintf(globa

74、l=%dn,global);浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/OpenMP编程技术编程技术并行区域编程并行区域编程(续续2)p并行区域之间的工作共享p工作队列n工作队列的基本工作过程即为维持一个工作的队列,线程在并行执行的时候,不断从这个队列中取出相应的工作完成,直到队列为空为止。p根据线程号分配任务n由于每一个线程在执行的过程中的线程标识号是不同的,可以根据这个线程标识号来分配不同的任务。p使用循环语句分配任务#pragma omp parallelprintf(outsideloopthread=%dn,omp_get_thread_num();#

75、pragma omp forfor(inti=0;i4;i+)printf(insideloopi=%dthread=%dn,i,omp_get_thread_num();浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/OpenMP编程技术编程技术并行区域编程并行区域编程(续续3)p工作分区编码(sections)#pragma omp parallel sections#pragma omp sectionprintf(section1thread=%dn,omp_get_thread_num();#pragma omp sectionprintf(section

76、2thread=%dn,omp_get_thread_num();#pragma omp sectionprintf(sectino3thread=%dn,omp_get_thread_num();程序运行结果为:section1thread=0section2thread=1sectino3thread=0浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/OpenMP线程同步线程同步pOpenMP支持两种不同类型的线程同步机制n互斥锁n事件通知机制p数据竞争inti;intmax_num=-1;#pragmaompparallelforfor(i=0;imax_nu

77、m)max_num=ari;p互斥锁机制n在OpenMP中,提供了三种不同的互斥锁机制用来对一块内存进行保护,它们分别是临界区(critical),原子操作(atomic)以及由库函数来提供同步操作。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/OpenMP线程同步线程同步临界区临界区p在程序需要访问可能产生竞争的内存数据的时候,都需要插入相应的临界区代码。p临界区编译指导语句的格式如下所示:#pragmaompcritical(name)blockinti;intmax_num_x=max_num_y=-1;#pragmaompparallelforfor(i=

78、0;imax_num_x)max_num_x=arxi;#pragmaompcritical(max_ary)if(aryimax_num_y)max_num_y=aryi;浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/OpenMP线程同步线程同步原子操作原子操作p原子操作是OpenMP编程方式给同步编程带来的特殊的编程功能,通过编译指导语句的方式直接获取了现在多处理器计算机体系结构的功能。通过#pragmaompatomic编译指导语句提供。p只能作用在语言内建的基本数据结构。#pragmaompatomicx=expr或者#pragmaompatomicx+/

79、orx-,-x,+xintcounter=0;#pragmaompparallelfor(inti=0;i10000;i+)#pragma omp atomic /atomic operationcounter+;printf(counter=%dn,counter);浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/OpenMP运行时库函数的互斥锁支持运行时库函数的互斥锁支持pOpenMP通过一系列的库函数支持更加细致的互斥锁操作p编译指导语句进行的互斥锁支持只能放置在一段代码之前,作用在这段代码之上。p程序员必须自己保证在调用相应锁操作之后释放相应的锁,否则就会造

80、成多线程程序的死锁。函数名称描述void omp_init_lock(omp_lock_t *)初始化一个互斥锁voidomp_destroy_lock(omp_lock_t*)结束一个互斥锁的使用并释放内存voidomp_set_lock(omp_lock_t*)获得一个互斥锁void omp_unset_lock(omp_lock_t *)释放一个互斥锁intomp_test_lock(omp_lock_t*)试图获得一个互斥锁,并在成功是返回真(true),失败是返回假(false)浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/OpenMP多线程应用程序性能

81、分析多线程应用程序性能分析p影响性能的主要因素n根据Amdahl定律,我们应当努力提高并行化代码在应用程序中的比率,这是通用的提高效率的方法。nOpenMP本身的开销n负载均衡p如果各个线程之间的负载不均衡,就有可能造成某些线程在执行过程中无事可干,经常处于空闲状态;而另外一些线程则负担沉重,需要很长时间才能够完成任务。n局部性n线程同步带来的开销多核程序设计多核程序设计第七章第七章 MPI编程及性能优化编程及性能优化2007年6月12日浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/MPI简介简介pMPI及其历史n消息传递接口(MessagePassingInte

82、rface,简称MPI)是一种编程接口标准,而不是一种具体的编程语言。n由消息传递接口论坛(MessagePassingInterfaceForum,简称MPIF)发起讨论并进行规范化的。nMPI标准如今已经成为事实意义上的消息传递并行编程标准,也是最为流行的并行编程接口。pMPI标准定义了一组具有可移植性的编程接口。p典型的实现包括开源的MPICH、LAMMPI以及不开源的INTELMPI。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/MPI程序特点程序特点p消息传递指的是并行执行的各个进程具有自己独立的堆栈和代码段。p分类:n单程序多数据(SingleProg

83、ramMultipleData,简称SPMD)prog_aLoadProcessStoreprocess 0process 1process 2LoadProcessGatherStore浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/MPI程序特点程序特点(续续)p分类:n多程序多数据MPMD(a) MPMDMaster/Worker(b) MPMDCoupled AnalysisNode 1Node 2Node 3Node 1Node 2Node 3prog_aprog_bprog_aprog_bprog_c(c) MPMDStreamlineprog_apro

84、g_bprog_cNode 1 Node 2Node 3浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/MPI编程基础编程基础p简单的MPI程序示例#include#include mpi.hintmain(intargc,char*argv)intrank;intsize; MPI_Init( argc, argv );MPI_Comm_rank(MPI_COMM_WORLD,&rank);MPI_Comm_size(MPI_COMM_WORLD,&size);printf(Helloworldfromprocess%dof%dn,rank,size); MPI_

85、Finalize()();return0;Helloworldfromprocess0of4Helloworldfromprocess1of4Helloworldfromprocess2of4Helloworldfromprocess3of4浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/MPI程序的四个基本函数程序的四个基本函数pMPI_Init和MPI_FinalizenMPI_Init初始化MPI执行环境,建立多个MPI进程之间的联系,为后续通信做准备。而MPI_Finalize则是结束MPI执行环境。pMPI_Comm_rankn来标识各个MPI进程pMPI

86、_Comm_sizen用来标识相应进程组中有多少个进程浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/MPI的点对点通信的点对点通信p两个最重要的MPI函数MPI_Send和MPI_Recv。pintMPI_SEND(buf,count,datatype,dest,tag,comm)n这个函数的含义是向通信域comm中的dest进程发送数据。消息数据存放在buf中,类型是datatype,个数是count个。这个消息的标志是tag,用以和本进程向同一目的进程发送的其他消息区别开来。pintMPI_RECV(buf,count,datatype,source,tag,

87、comm,status)nMPI_Recv绝大多数的参数和MPI_Send相对应,有相同的意义,很好理解。唯一的区别就是MPI_Recv里面多了一个参数status。status主要显示接收函数的各种错误状态。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/消息管理消息管理7要素要素pMPI最重要的功能莫过于消息传递。正如我们先前看到一样,MPI_Send和MPI_Recv负责在两个进程间发送和接收消息。总结起来,点对点消息通信的参数主要是由以下7个参数组成:n发送或者接收缓冲区buf;n数据数量count;n数据类型datatype;n目标进程或者源进程desti

88、nation/source;n消息标签tag;n通信域comm;.n消息状态status,只在接收的函数中出现。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/错误管理错误管理pMPI在错误管理方面提供了丰富的接口函数,这里我们介绍其中最简单的部分接口。n用status.MPI_ERROR来获取错误码。nMPI终止MPI程序执行的函数MPI_Abort。nintMPI_Abort(MPI_Commcomm,interrorcode)p它使comm通信域的所有进程退出,返回errorcode给调用的环境。通信域comm中的任一进程调用此函数都能够使该通信域内所有的进程

89、结束运行。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/MPI群集通信群集通信p同步n本函数接口是:intMPI_Barrier(MPI_Commcomm)n在操作中,通信子comm中的所有进程相互同步,即它们相互等待,直到所有进程都执行了他们各自的MPI_Barrier函数,然后再各自接着开始执行后续的代码。p广播n从一个root进程向组内所有其他的进程发送一条消息。接口是:intMPI_Bcast(void*buffer,intcount,MPI_Datatypedatatype,introot,MPI_Commcomm)浙浙 江江 大大 学学 英英 特特 尔

90、尔 技技 术术 中中 心心http:/MPI群集通信群集通信(续续)p聚集n聚集函数MPI_Gather是一个多对一的通信函数。其接口为:intMPI_Gather(void*sendbuf,intsendcnt,MPI_Datatypesendtype,void*recvbuf,intrecvcnt,MPI_Datatyperecvtype,introot,MPI_Commcomm)p播撒nMPI_Scatter是一对多的传递消息。但是它和广播不同,root进程向各个进程传递的消息是可以不同的。Scatter实际上执行的是与Gather相反的操作。浙浙 江江 大大 学学 英英 特特 尔尔 技

91、技 术术 中中 心心http:/MPI群集通信群集通信(续续2)p扩展的聚集和播撒操作nMPI_Allgather的作用是每一个进程都收集到其他所有进程的消息,它相当于每一个进程都执行了MPI_Gather执行完了MPI_Gather之后,所有的进程的接收缓冲区的内容都是相同的,也就是说每个进程给所有进程都发送了一个相同的消息。intMPI_Allgather(void*sendbuf,intsendcount,MPI_Datatypesendtype,void*recvbuf,intrecvcount,MPI_Datatyperecvtype,MPI_Commcomm)浙浙 江江 大大 学学

92、 英英 特特 尔尔 技技 术术 中中 心心http:/MPI群集通信群集通信(续续3)p全局交换nMPI_Alltoall的每个进程可以向每个接收者发送数目不同的数据,第i个进程发送的第j块数据将被第j个进程接收并存放在其接收消息缓冲区recvbuf的第i块,每个进程的sendcount和sendtype的类型必须和所有其他进程的recvcount和recvtype相同,这也意谓着在每个进程和根进程之间发送的数据量必须和接收的数据量相等。intMPI_Alltoall(void*sendbuf,intsendcount,MPI_Datatypesendtype,void*recvbuf,int

93、recvcount,MPI_Datatyperecvtype,MPI_Commcomm)浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/解决负载均衡问题解决负载均衡问题p稠密的矩阵与向量乘法运算是一个静态负载平衡的例子,假设矩阵为NM阶,而有p个相同处理器可以用于计算,按行分解每个处理器分得或行,若干按列分解每个处理器分得或列。MN处理器0处理器1 处理器p-2处理器p-1多核程序设计多核程序设计第八章多核软件工具介绍第八章多核软件工具介绍2007年6月12日浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/C+编译器编译器p英特尔C+编译

94、器的主要功能与优点:n支持英特尔多核心处理器以及现有的英特尔处理器与体系结构,针对最新英特尔处理器的先进优化功能可以帮助产生出众的应用程序性能。n与针对IA-32的MicrosoftVisualC+、MicrosoftVisualC+6.0代码以及MicrosoftVisualC+.NET保持跨体系结构的兼容性。n针对最新英特尔处理器的先进优化功能可以帮助产生出众的应用程序性能。LinuxWindows作用-O0/Od禁止优化-g/Zi生成标记-O1/O1优化二进制代码-O2/O2优化速度(默认)-O3/O3优化数据缓存浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:

95、/C+编译器编译器(续续)p英特尔C+编译器支持以下语言标准:nANSI/ISO标准,用于C语言编译(ISO/IEC9899:1990)nANSI/ISO标准(ISO/IEC14882:1998)用于C+语言nOpenMP*规范2.5版p英特尔C+编译器与其他常用工具保持兼容,可以集成到广泛使用的开发环境,并且同其他广泛使用的编译器保持着特性源与二进制方面的兼容性。p集成了MicrosoftVisualStudio2005、VisualStudio.NET*2002/2003以及VisualStudio98p提供扩展32位和64位多核英特尔处理器支持。浙浙 江江 大大 学学 英英 特特 尔尔

96、技技 术术 中中 心心http:/C+编译器实验编译器实验p实验要求n硬件p英特尔多核处理器p512MB内存p20GB硬盘p支持32位像素显卡n软件pWindowsXP*SP2pMicrosoftVisualStudio*.NET2003p英特尔C+编译器9.0或更高版本p英特尔VTune性能分析器7.2或更高版本p英特尔ThreadChecker线程检查器2.2或更高版本p英特尔ThreadProfiler线程档案器2.2或更高版本p实验代码浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/C+编译器实验编译器实验高阶优化高阶优化使用高使用高阶优化化编译开关(开关(

97、-O3)先清理以前生成的文件:nmake/fraytrace2.makclean打开-O3开关编译文件:nmake/fraytrace2.makCF=-O3运行渲染图像程序:raytrace2320240PressgtobegintherenderPressqtoquittheapplication将屏幕上显示的运行时间记录下来_。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/C+编译器实验编译器实验原始编译原始编译用微软用微软C+编译器编译编译器编译将光盘内的code文件夹整个复制到硬盘,如E盘根目录,在上面的命令行界面输入如下命令跳转到RayTrace2目录:

98、cdE:codeCompilerSwitchesraytrace2sourceRayTrace2然后清理以前生成的文件:nmake/fraytrace2.makclean编译文件:nmake/fraytrace2.makCPP=cl.exe运行渲染图像程序:raytrace2320240PressgtobegintherenderPressqtoquittheapplication将屏幕上显示的运行时间记录下来_。用英特尔用英特尔C+编译器编译编译器编译先清理以前生成的文件:nmake/fraytrace2.makclean编译文件:nmake/fraytrace2.mak运行渲染图像程序:r

99、aytrace2320240PressgtobegintherenderPressqtoquittheapplication将屏幕上显示的运行时间记录下来_。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/C+编译器实验编译器实验过程间优化过程间优化使用使用过程程间优化开关(化开关(-Qipo)先清理以前生成的文件:nmake/fraytrace2.makclean打开-O3开关编译文件:nmake/fraytrace2.makCF=-QipoLF=-Qipo运行渲染图像程序:raytrace2320240PressgtobegintherenderPressqto

100、quittheapplication将屏幕上显示的运行时间记录下来_。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/C+编译器实验编译器实验档案导引优化档案导引优化使用档案使用档案导引引优化开关(化开关(-Qprof_gen, -Qprof_use)先清理以前生成的文件:nmake/fraytrace2.makclean编译产生档案导引优化二进制指令:nmake/fraytrace2.makCF=-Qprof_gen-Qprof_dir.RayTrace2运行渲染图像程序:raytrace2320240PressgtobegintherenderPressqtoq

101、uittheapplication将屏幕上显示的运行时间记录下来_。注:因为要生成档案导引优化的记录信息,会消耗大量时间。使用刚才生成的档案导引优化信息再次编译:nmake/fraytrace2.makcleannmake/fraytrace2.makCF=-Qprof_use-Qprof_dir.RayTrace2注:可忽略“no.dpiinformation”提示。运行渲染图像程序:raytrace2320240PressgtobegintherenderPressqtoquittheapplication将屏幕上显示的运行时间记录下来_。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术

102、术 中中 心心http:/C+编译器实验编译器实验矢量化优化矢量化优化用矢量化开关用矢量化开关优化(化(-QxP)先清理以前生成的文件:nmake/fraytrace2.makclean打开-O3开关编译文件:nmake/fraytrace2.makCF=-QxP运行渲染图像程序:raytrace2320240PressgtobegintherenderPressqtoquittheapplication将屏幕上显示的运行时间记录下来_。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/C+编译器实验编译器实验综合优化综合优化使用上述所有使用上述所有优化开关(化开关(

103、-O3, -QxP, IPO and PGO)先清理以前生成的文件:nmake/fraytrace2.makclean打开-O3开关编译文件:nmake/fraytrace2.makCF=-O3-QxP-Qipo-Qprof_use-Qprof_dir.RayTrace2LF=-Qipo注:不必再次收集档案导引优化信息,使用之前第四小节生成的信息即可。运行渲染图像程序:raytrace2320240PressgtobegintherenderPressqtoquittheapplication将屏幕上显示的运行时间记录下来_。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心ht

104、tp:/VTune性能分析器性能分析器p英特尔VTune性能分析器的主要功能包括:n取样功能、调用图功能、计数器监视器以及经过改进的Intel调优助手n在Windows下同时提供图形化与命令行界面n允许选择是否与VisualStudio.NET集成n为基于IA-32与英特尔安腾处理器的Linux应用程序提供远程支持n可以对基于IntelPXA250、PXA255与PXA26x处理器的应用程序进行取样浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/VTune性能分析器性能分析器取样取样pVTune性能分析器中的取样功能可以帮助开发者分辨程序中最消耗时间的函数和模块,并

105、给出操作系统和应用程序的详细视图。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/VTune性能分析器性能分析器调用曲线图调用曲线图p调用曲线图通过分析程序运行时函数的入口点和出口点,生成一张调用曲线图并且确定调用顺序和显示关键路径。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/VTune性能分析器性能分析器计数器监控器计数器监控器p计数器监控器在运行时跟踪系统活动,确定是否会因为可用内存减少或文件输入/输出性能问题而导致应用程序速度变慢。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/VTune性能分析器性

106、能分析器调优助手调优助手p根据丰富的知识库分辨性能问题,自动推荐代码改进办法,帮助提高开发者的工作效率。它提供了基于性能计数器的视图,以及关于Windows操作系统和英特尔最新处理器的建议,以及源代码的改进建议。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/性能分析器实验性能分析器实验寻找热点区域寻找热点区域p问题:gzip.exe中哪个函数消耗了最多的时间?gzip.exe中哪个函数CPI最高?gzip.exe源代码中哪一行时钟周期最多?gzip.exe是多线程程序吗?浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/MKL数学核心函数

107、库数学核心函数库p英特尔数学核心函数库(MKL)是一套经过高度优化的、线程安全的数学例程、函数,并在此基础上加入了在Linux集群环境下的ScaLAPACK(ScalableLAPACK),它们专门针对计算性能要求很高的科学、工程及金融等领域的应用程序而设计。p此内核库的功能领域包括:n线性代数BLAS、LAPACKnScaLAPACKnPARDISO稀疏矩阵解算器n离散傅立叶变换(DiscreteFouriertransforms,DFTs)n矢量数学库(VectorMathLibrary,VML)n矢量统计库(VectorStatisticalLibrary,VSL)随机数生成器浙浙 江江

108、 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/MKL数学核心函数库性能数学核心函数库性能p英特尔安腾2处理器nFFTp单双精度,1维实数FFT在n=2、4、8、16、32、64和128时速度最多提高了3倍nVMLpLn、Log10、Asin、Acos、Sinh、Cosh函数的性能提高了25-83%p长矢量(双精度n250,000或单精度n500,000)的性能平均值提高了60%以上。这使每个元素的性能限定在小矢量性能的20%以内。nVSLp高斯和多元高斯分布生成器的性能分别提高了35%和15%。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/MK

109、L数学核心函数库性能数学核心函数库性能(续续)p英特尔酷睿2双核处理器nBLASpZDOTU、ZDOTC-缓存数据的性能提高了10-35%nVSLp性能提高了大约13%nVMLpVML中Div和Inv函数的性能提高了2.7倍pAsin和Acos函数的性能提高了5-20%p其他提升浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/MKL数学核心函数库实验数学核心函数库实验矩阵乘法矩阵乘法p演示了原始计算、一级BLAS、二级BLAS、三级BLAS的性能特征和它们之间的差异。请按照以下实验步骤执行:n定位到文件夹codeMKL_OverviewDGEMM,打开文件mkl_l

110、ab_solution.c,仔细查看4段不同方法实现同一矩阵乘法的代码;n检查文件Makefile中的include和library路径,修改为与本机一致;n打开开始菜单-所有程序-Intel(R)SoftwareDevelopmentTools-Intel(R)C+Compiler9.0-BuildEnvironmentforIA-32Applications,输入:nmake,编译完成后目录下会生成一个matrix.exe文件,输入:matrix.exe运行程序,会提示输入矩阵的维数(输入的数字尽量大些,如1000),记录运行结果并观察它们的差异:nroll_your_own:_nDDOT

111、:_nDGEMV:_nDGEMM:_nMKL默认使用单线程,可以通过改变环境变量OMP_NUM_THREADS来自定义MKL使用的线程数量,输入:setOMP_NUM_THREADS=2,重新运行程序观察结果;n改变不同线程数量,记录各自的运行结果。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/MKLMKL数学核心函数库实验数学核心函数库实验数学核心函数库实验数学核心函数库实验蒙特卡罗法计算圆周率蒙特卡罗法计算圆周率蒙特卡罗法计算圆周率蒙特卡罗法计算圆周率p定位到文件夹codeMKL_OverviewMonteCarloPi,打开文件pimonte.c。理解函数r

112、and()实现的原理;n问题:问题:代码中的循环体能用多线程实现吗?p打开文件pimonte_VSL.c,观察用库函数调用替代函数rand()所产生的变化;n问题:问题:p为什么不是1:1的直接替换rand()函数?p设置blocksize的目的是什么?p参数BRNG和VSL_BRNG_MCG31的作用是什么?p对这个程序来说,它们是最好的选择吗?p能用多线程实现吗?p检查文件Makefile.VSL中的include和library路径,修改为与本机一致;p先编译运行原始算法程序,输入:nmakefMakefile.rand,生成文件pimonte_rand.exe,运行它并记录结果;再编译

113、运行VSL改进算法程序,输入:nmakefMakefile.VSL,生成文件pimonte_VSL.exe,运行它并记录结果;p改变环境变量OMP_NUM_THREADS,设置不同的线程数量,观察结果有什么变化。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/Thread Checker线程检查器线程检查器p可快速查找和修复Win*和OpenMP*线程软件中的bug。它监控程序执行过程中的线程行为,发现其中存在的竞争现象、线程阻塞以及潜在的线程死锁问题,提示同线程错误相关的源代码位置、侵权变量以及堆栈跟踪等。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中

114、 心心http:/线程检查器实验线程检查器实验寻找潜在的数据竞争寻找潜在的数据竞争p编译和运行和运行Potential程序的程序的单线程版本程版本n打开codeThreadCheckerpotential_serial文件夹,双击potential_serial.sln文件;n在Build菜单里选择Configuration Manager,然后选择Debug模式;n在Build菜单里选择Build Solution,编译相关文件;n在Debug菜单里选择Start Without Debugging,运行程序。p编译和运行和运行Potential程序的多程序的多线程版本程版本n打开codeT

115、hreadCheckerpotential_win文件夹,双击potential_win.sln文件;n在Build菜单里选择Configuration Manager,然后选择Debug模式;n按如下方式配置项目属性:p选中Debug模式(/Zi)p链接时保留Debug信息(/DEBUG)p禁止自动优化(/Od)p使用线程安全系统库(/MDd)p使用二进制文件可重定位功能(/fixed:no)浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/线程检查器实验线程检查器实验线程检查器实验线程检查器实验寻找潜在的数据竞争寻找潜在的数据竞争寻找潜在的数据竞争寻找潜在的数据竞

116、争( (续续续续) )p在Build菜单里选择Build Solution,编译相关文件;p在Debug菜单里选择Start Without Debugging,运行程序;p运行英特尔VTune性能分析器;p点击New Project;p在Category栏选择Threading Wizards,在下拉框中选择Intel Thread Checker Wizard;p选择刚才编译好的可执行文件路径(codeThreadCheckerpotential_winDebugpotential_win.exe),点击Finish按钮,开始运行线程检查器;p线程检查器分析完毕后会显示一些诊断报告,双击可

117、观察相应代码;p问题:为什么会出现这些冲突?浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/线程检查器实验线程检查器实验解决数据竞争问题解决数据竞争问题p解决前一个实验里英特尔线程检查器诊断出来的那些线程错误。哪些变量可以作为线程中的共享变量?哪些变量应该作为每个线程的私有变量?哪些变量出于线程同步的考虑,必须保护起来?p修改好代码中的错误后,重新编译运行,并用线程检查器检测,直到没有诊断错误为止;p当消灭代码中的线程问题后,把粒子和循环数量改为之前单线程版本的数量,重新编译运行。p问题:修改好的多线程程序运行结果和之前的单线程程序一样吗?浙浙 江江 大大 学学 英

118、英 特特 尔尔 技技 术术 中中 心心http:/线程检查器实验线程检查器实验检测死锁问题检测死锁问题p打开codeThreadCheckerDeadlock文件夹,双击Deadlock.sln文件p在Build菜单里选择Configuration Manager,然后选择Debug模式;p按照上一小节实验里的方法配置项目属性;p在C/C+菜单中,选择Command Line,填入/Qtcheck;p在Build菜单里选择Build Solution,编译相关文件;p在Debug菜单里选择Start Without Debugging,运行程序。p问题:运行结果正确吗?为什么?浙浙 江江 大大

119、 学学 英英 特特 尔尔 技技 术术 中中 心心http:/Thread Profiler线程档案器线程档案器p可以帮助调整Win32*和OpenMP*线程化软件的性能。该工具通过监控程序的运行来检测线程性能的相关问题,包括线程过载和同步冲突,能够帮助查找负载平衡,同步开销等线程性能问题。可以进行关键路径分析。p线程档案器功能nWin32*线程分析能力nOpenMP*线程分析能力浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/线程档案器实验线程档案器实验负载平衡问题负载平衡问题p编译和运行和运行Potential多多线程程序程程序n打开codeThreadProfi

120、lerPotentialLab2文件夹,双击PotentialLab2.sln文件;n注意到源代码中两个事件变量bSignal和eSignal的定义和初始化,以及tPoolComputePot函数中done变量的使用,它控制模拟完成时线程的终结;n选择Release模式编译,并像前一小节设置好项目属性,编译程序;n打开VTune性能分析器,创建一个新的ThreadProfiler活动,装入刚才编译生成的可执行文件,开始分析。p根据根据线程档案器的分析数据程档案器的分析数据诊断程序性能断程序性能问题n观察关键路径视图,注意到大部分时间都消耗在Serialimpacttime,即串行执行时间。并行

121、级视图进一步确认了大部分时间都只有一个线程在执行。浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/线程档案器实验线程档案器实验负载平衡问题负载平衡问题(续续)p根据根据线程档案器的分析数据程档案器的分析数据诊断程序性能断程序性能问题n打开groupingtoobject视图,哪个对象占用了串行执行时间?这个对象限制了其他对象对数据进行访问吗?如果是这样的话,能否改变程序和数据访问的模式,以减少线程占有同步对象的时间?n注:同步对象eSignal是用来标识线程何时完成,而非用来保护数据,主线程是唯一一个串行执行的。为了保证程序运行的正确性,主线程串行执行很有必要。因此

122、,修改数据不会影响到状况。n若问题不是由数据保护这些同步对象引起的,那可能是因为线程自身引起的。打开groupingtothread视图,是否有一个或多个线程占用了关键路径中的串行执行时间?如果有,是哪几个?n比较每个tpoolComuptePot(worker)线程的生存时间和活跃时间,有哪些启发?浙浙 江江 大大 学学 英英 特特 尔尔 技技 术术 中中 心心http:/线程档案器实验线程档案器实验负载平衡问题负载平衡问题(续续2)p解决性能解决性能问题n回到MicrosoftVisualStudio界面,观察源代码:在computePot函数中,每个线程用它分配的标识符(tid)来划分它要完成的任务块。然而,在内部的循环需要用到外部循环的索引作为结束条件。因此,外部循环的索引越大时,内部循环的迭代次数也越多,而相应划分到的线程所要完成的任务也越重。n有一个很好的方法能解决这种负载不平衡问题,即采用更灵活的任务分配机制。例如,不采用将连续的迭代分配给一个线程,而交叉分配给多个线程,比如只有两个线程时,可将奇数次的迭代分配给一个线程,而将偶数次的迭代分配给另一个线程。n按照上面提示的方法,修改源代码的任务分配机制,结合线程档案器,使程序的线程负载趋于平衡

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号