多核多线程

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1多核多线程复习资料1.什么是CMP单芯片多处理器(ChipMultiprocessors,简称CMP),将大规模并行处理器中的SMP(对称多处理器)集成到同一芯片内,各个理器并行执行不同的进程。2.并行计算的菲林分类单指令流单数据流(SingleInstructionstreamSingleDatastream,SISD)单指令流多数据流(SingleInstructionstreamMultipleDatastream,SIMD)多指令流单数据流(MultipleInstructionstreamSingleDatastream,MISD)多指令流多数据流(MultipleInstructionstreamMultipleDatastream,MIMD)3.进程和线程的区别进程是正在被执行的程序,是系统进行资源分配和调度的一个独立单位,是一个动态的概念。线程是程序的有序控制流,是被执行的指令序列。线程属于进程,线程运行在进程空间内。4.线程的特点线程因创建而产生,因调度而处于运行状态,因等待资源或事件而处于阻塞状态。5.分解模式1.任务分解---园丁修理草坪2.数据分解---矩阵相乘&园丁修理草坪3.数据流分解---园丁修理草坪将一个复杂的过程划分成多个任务,这些任务按照某种顺序执行,这种分解方式成为数据流分解。---要求:理解,分析,举例总结:任务分解下分工工作,相互配合;数据分解模式下分工明确,互不干扰;数据流分解模式下前一个工作是后一个工作开始的前提。6.理解处理任务之间的数据依赖关系的战略有什么?变量本地化:最简单的解决方案就是创建,初始化,并使用局部变量改造变量(把共享变量改造成不共享的变量)规约:创建线程1和线程2的局部变量sum1和sum2,然后sum1初始化,并计算循环的奇数迭代,sum2初始化和计算循环的偶数迭代。每个线程都独立计算其迭代。在循环结束时,主线程可以组合规约变量的总和(sum1+sum2)。27.常用的同步机制1.临界区:每个进程有一个代码段,称为临界区,在那儿共享数据被访问,在任意时刻只允许一个线程对这些资源进行访问。2.信号量:包含两个操作:wait(),signal(),wait操作信号量减1,signal操作信号量加1.3.互斥量:线程互斥是线程之间所发生的一种间接性相互作用,这种相互作用是进程本身不希望的,也是运行线程感觉不到的。线程互斥可能发生在相关线程之间,也可能发生在不相关进程之间。互斥量(Mutex)作为一种互斥设备,有两个状态,上锁和空闲。同一时刻只能有一个线程能够对互斥量加锁。对于一个已经被加锁的互斥量,当另外一个线程试图对它加锁时,该线程会被阻塞,直到该互斥量被释放。4.栅梯:所有线程必须全部完成某段代码之后才能开始下一步的同步方式操作称为barrier。栅障同步又称为等待同步。8.重点理解互斥量两个状态:上锁和空闲互斥量是一种锁,线程对共享资源进行访问之前必须先获得锁,否则,线程保持等待状态,直到锁可用,只有其他线程都不占有它时,一个线程才可以占有它。占有锁的过程叫做锁定或者获得互斥量。9.理解死锁和活锁如果两个线程都各自加锁了一个互斥量,然后申请加锁对方的互斥量,这样会陷入阻塞,这样的话,这两个线程永远不会从阻塞中恢复,此时,这两个线程处于死锁状态。所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。活锁:指的是任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试,失败,尝试,失败。活锁的发生是指线程之间不断冲突,不断退避活锁和死锁的区别在于,处于活锁的实体是在不断的改变状态,所谓的“活”,而处于死锁的实体表现为等待;活锁有可能自行解开,死锁则不能。10.Inter设计的并行开发流程的4个阶段DESIGN(设计)CODE&DEBUG(编码,调试)VERIFY(验证)TUNE(调试)理解每个Parallelstudio组件对应在那个阶段使用Design-----AdvisorCODE&DEBUG-----ComposerVerify------InspectorTUNE-------Amplifier并行开发流程四个组件:设计,编码调试,检查,优化并行开发流程的阶段:顾问,设计开发,检查,优化11.内核对象有线程对象,有互斥量;临界区不是内核对象。内核对象是由操作系统内核分配的,只能由内核访问的一个内存块,用来供系统和应用程序使用和管理各种系统资源。内核对象包括存取符号对象、事件对象、文件对象、作业对象、互斥量、管道对象、进程对象、信标对象、线程对象和等待计数器对象等。不同的内核对象拥有不同的数据结构。3内核对象只能被内核程序访问,应用程序无法在内存中找到这些数据结构并直接改变它们的内容。句柄是一种指向指针的指针。Windows中的句柄实际上是一个唯一的数字,它引用一个Windows对象,例如窗口、图标等。Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知句柄地址来保存。这样只需记住句柄地址就可以间接知道对象具体在内存中的哪个位置。句柄地址(稳定)→记载着对象在内存中的地址→对象在内存中的地址(不稳定)→实际对象Windows提供了一组函数,访问并操作内核对象。当调用一个用于创建内核对象的函数时,该函数就返回一个用于标识该对象的句柄。句柄可以被视为一个不透明的值,进程中的任何线程都可以使用这个值,将这个句柄传递给Windows的各个函数,这样系统就能知道要操作哪个内核对象。12.WIN32多线程API:CreateThreadcloseThreadwaitforSingleobjectcreateMutexreleaseMutexEntercriticalSectionleavecriticalSectionwaitforSingleObjectWaitForMultipleObjects(线程之间的等待、互斥量加锁)createMutex、releaseMutex互斥量EnterCriticalsection、LeaveCriticalsection临界区Win32线程同步的实现全局变量(globalvariable)事件(Event)互斥量(Mutex)临界区(Criticalsection)信号量(Semaphore)互斥量:Mutex对象在不被任何线程拥有时才有信号,而当被拥有时则无信号。该对象适合用来协调多个线程对共享资源的互斥访问。1建立互斥体对象,得到句柄:HANDLECreateMutex(LPSECURITY_ATTRIBUTESlpMutexAttributes,BOOLbInitialOwner,LPCTSTRlpName);2在线程可能产生冲突的区域前(即访问共享资源之前),将互斥量句柄传给函数:WaitForSingleObject(hMutex,dwMilliseconds),请求占用互斥对象。3共享资源访问结束,释放对互斥体对象的占用:ReleaseMutex(hMutex);4关闭互斥量对象句柄:CloseHandle(hMutex);互斥对象在同一时刻只能被一个线程占用。互斥对象属于内核对象,它能够确保线程拥有对单个资源的互斥访问权。互斥对象包含一个使用数量,一个线程ID和一个计数器。ID用于标识系统中的哪个线程当前拥有互斥对象,计数器用于指明该线程拥有互斥对象的次数。临界区critical_setioninitializeenterleavedelete定义临界区对象,通常为全局变量,方便多个线程对其引用:1CRITICAL_SECTIONcs;4初始化临界区对象:2InitializeCriticalSection(&cs);进入临界区段:3EnterCriticalSection(&cs);离开临界区段:4LeaveCriticalSection(&cs);删除临界区对象:5DeleteCriticalSection(&cs);信号量可按下列步骤使用该对象:首先,创建信号对象:HANDLE(句柄)HANDLECreateSemaphore();或者打开一个信号对象:HANDLEOpenSemaphore();然后,在线程访问共享资源之前调用:WaitForSingleObject();共享资源访问完成后,应释放对信号对象的占用:ReleaseSemaphore();事件事件对象也属于内核对象,包含一个使用计数,一个用于指明该事件是一个自动重置的事件还是一个人工重置的事件的布尔值,另一个用于指明该事件处于已通知状态还是未通知状态的布尔值。有两种不同类型的事件对象。一种是人工重置的事件,另一种是自动重置的事件。当人工重置的事件得到通知时,等待该事件的所有线程均变为可调度线程。当一个自动重置的事件得到通知时,等待该事件的线程中只有一个线程变为可调度线程。13、OpenMP简介一种面向共享内存以及分布式共享内存的多处理器多线程并行编程语言。一种能够被用于显式指导多线程、共享内存并行的应用程序编程接口(API)。OpenMP具有良好的可移植性,支持多种编程语言。OpenMP能够支持多种平台,包括大多数的类UNIX系统以及WindowsNT系统(Windows2000,WindowsXP,WindowsVista等)。OpenMP的编程模型以线程为基础,通过编译指导语句来显示地指导并行化,为编程人员提供了对并行化的完整的控制。OpenMP的执行模型采用Fork-Join的形式。Fork:创建新线程或唤醒已有线程,Join:多线程的汇合14、OpenMP编译指导语句循环并行化#pragmaompparallelforprivate(i)reduction(+;sum)OpenMP的功能由两种形式提供:编译指导语句运行时库函数编译指导语句在编译器编译程序的时候,会识别特定的注释,而这些特定的注释就包含着OpenMP程序的一些语义。5#pragmaompdirective[clause[[,]clause]…]其中directive部分就包含了具体的编译指导语句,包括parallel,for,parallelfor,section,sections,single,master,critical,flush,ordered和atomic。将串行的程序逐步地改造成一个并行程序,达到增量更新程序的目的,减少程序编写人员一定的负担。运行时库函数OpenMP运行时函数库原本用以设置和获取执行环境相关的信息,它们当中也包含一系列用以同步的API。支持运行时对并行环境的改变和优化,给编程人员足够的灵活性来控制运行时的程序运行状况。OpenMP的目标标准性简洁实用使用方便可移植性15、独立于体系机构的性能优化三种方法(1)避免冗余的函数调用消除循环不变量、减少过程调用、消除不必要的内存存取(2)避免不必要的边界检查(3)利用局部变量保存中间计算结果16、死锁发生必要满足的条件?死锁的发生必须满足的条件:(哲学家进餐问题)对资源的访问时独占的;线程在已经占有了一个资源时继续请求其它资源;所有线程都不放弃已经占有的资源;线程对资源的请求形成一个环,其中每个资源都被一个线程所占用,而每个线程都在请求另一个线程所占有的资源。需同时满足17、理解避免死锁的方法:(哲学家进餐问题)(1)复制需要独占访问的资源。每个线程有一个自己的副本。(2)如无法复制:按顺序获取资源。(3)但一个线程无法获取其它资源时,首先放弃已经占有的资源避免活锁的条件:不断冲突,不断退让。18、非阻塞算法引起的问题有什么?(notblocking)非阻塞算法特征:无阻塞只要没有竞争,线程就可以持续执行无锁系统整体持续执行无等待每个线程都可以持续执行,即使遇到竞争CAS是compareandset的缩写1.ABA问题在进行CAS操作的时候,第一次读取V地址的A值,然后通过CAS来判断V地址的值是否仍旧为

1 / 9
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功