当前位置:文档之家› 多核多线程

多核多线程

多核多线程复习资料1. 什么是CMP单芯片多处理器(Chip Multiprocessors,简称CMP),将大规模并行处理器中的SMP (对称多处理器)集成到同一芯片内,各个理器并行执行不同的进程。

2 .并行计算的菲林分类单指令流单数据流(Si ngle In struction stream Si ngle Data stream, SISD) 单指令流多数据流(Single Instruction stream Multiple Data stream, SIMD ) 多指令流单数据流( Multiple Instruction stream Single Data stream, MISD ) 多指令流多数据流( Multiple In struction stream Multiple Data stream, MIMD )3•进程和线程的区别进程是正在被执行的程序,是系统进行资源分配和调度的一个独立单位,是一个动态的概念。

线程是程序的有序控制流,是被执行的指令序列。

线程属于进程,线程运行在进程空间内。

4•线程的特点线程因创建而产生,因调度而处于运行状态,因等待资源或事件而处于阻塞状态。

5•分解模式1•任务分解---园丁修理草坪2•数据分解---矩阵相乘&园丁修理草坪3•数据流分解---园丁修理草坪将一个复杂的过程划分成多个任务,这些任务按照某种顺序执行,这种分解方式成为数据流分解。

---要求:理解,分析,举例总结:任务分解下分工工作,相互配合;数据分解模式下分工明确,互不干扰;数据流分解模式下前一个工作是后一个工作开始的前提。

6 •理解处理任务之间的数据依赖关系的战略有什么?变量本地化:最简单的解决方案就是创建,初始化,并使用局部变量改造变量(把共享变量改造成不共享的变量)规约:创建线程1和线程2的局部变量suml和sum2,然后suml初始化,并计算循环的奇数迭代,sum2初始化和计算循环的偶数迭代。

每个线程都独立计算其迭代。

在循环结束时,主线程可以组合规约变量的总和( sum1+ sum2 )。

7 •常用的同步机制1•临界区:每个进程有一个代码段,称为临界区,在那儿共享数据被访问,在任意时刻只允许一个线程对这些资源进行访问。

2. 信号量:包含两个操作:wait (),signal(),wait操作信号量减1,signal操作信号量加1.3. 互斥量:线程互斥是线程之间所发生的一种间接性相互作用,这种相互作用是进程本身不希望的,也是运行线程感觉不到的。

线程互斥可能发生在相关线程之间,也可能发生在不相关进程之间。

互斥量(Mutex)作为一种互斥设备,有两个状态,上锁和空闲。

同一时刻只能有一个线程能够对互斥量加锁。

对于一个已经被加锁的互斥量,当另外一个线程试图对它加锁时,该线程会被阻塞,直到该互斥量被释放。

4. 栅梯:所有线程必须全部完成某段代码之后才能开始下一步的同步方式操作称为barrier。

栅障同步又称为等待同步。

8. 重点理解互斥量两个状态:上锁和空闲互斥量是一种锁,线程对共享资源进行访问之前必须先获得锁,否则,线程保持等待状态,直到锁可用,只有其他线程都不占有它时,一个线程才可以占有它。

占有锁的过程叫做锁定或者获得互斥量。

9. 理解死锁和活锁如果两个线程都各自加锁了一个互斥量,然后申请加锁对方的互斥量,这样会陷入阻塞,这样的话,这两个线程永远不会从阻塞中恢复,此时,这两个线程处于死锁状态。

所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。

此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。

活锁:指的是任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试,失败,尝试,失败。

活锁的发生是指线程之间不断冲突,不断退避活锁和死锁的区别在于,处于活锁的实体是在不断的改变状态,所谓的“活”,而处于死锁的实体表现为等待;活锁有可能自行解开,死锁则不能。

10. Inter设计的并行开发流程的4个阶段DESIGN (设计)CODE & DEBUG (编码,调试)VERIFY(验证)TUNE (调试)理解每个Parallel studio组件对应在那个阶段使用Design ---- A dvisor CODE & DEBUG——Composer Verify ------ In spectorTUNE ------ Amplifier并行开发流程四个组件:设计,编码调试,检查,优化并行开发流程的阶段:顾问,设计开发,检查,优化11. 内核对象有线程对象,有互斥量;临界区不是内核对象。

内核对象是由操作系统内核分配的,只能由内核访问的一个内存块,用来供系统和应用程序使用和管理各种系统资源。

内核对象包括存取符号对象、事件对象、文件对象、作业对象、互斥量、管道对象、进程对象、信标对象、线程对象和等待计数器对象等。

不同的内核对象拥有不同的数据结构。

内核对象只能被内核程序访问,应用程序无法在内存中找到这些数据结构并直接改变它们的内容。

句柄是一种指向指针的指针。

Windows中的句柄实际上是一个唯一的数字,它引用一个Windows对象,例如窗口、图标等。

Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知句柄地址来保存。

这样只需记住句柄地址就可以间接知道对象具体在内存中的哪个位置。

句柄地址(稳定记载着对象在内存中的地址T对象在内存中的地址(不稳定实际对象Windows提供了一组函数,访问并操作内核对象。

当调用一个用于创建内核对象的函数时,该函数就返回一个用于标识该对象的句柄。

句柄可以被视为一个不透明的值,进程中的任何线程都可以使用这个值,将这个句柄传递给Windows的各个函数,这样系统就能知道要操作哪个内核对象。

12. W IN32 多线程AP:CreateThread closeThread waitforSi ngleobject createMutex releaseMutex En tercriticalSect ion leavecriticalSect ionwaitforSi ngleObject WaitForMultipleObjects (线程之间的等待、互斥量加锁) createMutex、releaseMutex 互斥量EnterCriticalsection、LeaveCriticalsection 临界区Win32线程同步的实现全局变量(global variable )事件(Event)互斥量(Mutex)临界区(Critical section)信号量(Semaphore) 互斥量:Mutex对象在不被任何线程拥有时才有信号,而当被拥有时则无信号。

该对象适合用来协调多个线程对共享资源的互斥访问。

1建立互斥体对象,得到句柄:HANDLE CreateMutex(LPSECURITY_ATTRIBUTESpMutexAttributes , BOOL bInitialOwner , LPCTSTR IpName;2在线程可能产生冲突的区域前(即访问共享资源之前) ,将互斥量句柄传给函数:WaitForSingleObject(hMutex, dwMilliseconds),请求占用互斥对象。

3共享资源访问结束,释放对互斥体对象的占用:ReleaseMutex(hMutex);4关闭互斥量对象句柄:CloseHa ndle(hMutex);互斥对象在同一时刻只能被一个线程占用。

互斥对象属于内核对象,它能够确保线程拥有对单个资源的互斥访问权。

互斥对象包含一个使用数量,一个线程ID和一个计数器。

ID用于标识系统中的哪个线程当前拥有互斥对象,计数器用于指明该线程拥有互斥对象的次数。

临界区critical_setion initialize enter leave delete定义临界区对象,通常为全局变量,方便多个线程对其引用:1CRITICAL_SECTION cs;初始化临界区对象:2InitializeCriticalSection(&cs);进入临界区段:3EnterCriticalSection(&cs);离开临界区段:4LeaveCriticalSect ion(&cs);删除临界区对象:5DeleteCriticalSectio n(&cs);/亠口曰.信号量可按下列步骤使用该对象:首先,创建信号对象:HANDLE佝柄)HANDLE CreateSemaphore();或者打开一个信号对象:HANDLE Ope nSemaphore();然后,在线程访问共享资源之前调用:WaitForSingleObject();共享资源访问完成后,应释放对信号对象的占用:ReleaseSemaphore();事件事件对象也属于内核对象,包含一个使用计数,一个用于指明该事件是一个自动重置的事件还是一个人工重置的事件的布尔值,另一个用于指明该事件处于已通知状态还是未通知状态的布尔值。

有两种不同类型的事件对象。

一种是人工重置的事件,另一种是自动重置的事件。

当人工重置的事件得到通知时,等待该事件的所有线程均变为可调度线程。

当一个自动重置的事件得到通知时,等待该事件的线程中只有一个线程变为可调度线程。

13、OpenMP 简介一种面向共享内存以及分布式共享内存的多处理器多线程并行编程语言。

一种能够被用于显式指导多线程、共享内存并行的应用程序编程接口( API)。

OpenMP具有良好的可移植性,支持多种编程语言。

OpenMP能够支持多种平台,包括大多数的类UNIX系统以及Windows NT系统(Windows 2000,Windows XP,Windows Vista 等)。

OpenMP的编程模型以线程为基础,通过编译指导语句来显示地指导并行化,为编程人员提供了对并行化的完整的控制。

OpenMP的执行模型采用Fork-Join的形式。

Fork:创建新线程或唤醒已有线程,Join:多线程的汇合14、OpenMP编译指导语句循环并行化#pragma omp parallel for private ( i) reduction (+;sum)OpenMP的功能由两种形式提供:编译指导语句运行时库函数编译指导语句在编译器编译程序的时候,会识别特定的注释,而这些特定的注释就包含着OpenMP程序的一些语义。

#pragma omp <directive> [clause[ [,] clause] …]其中directive 部分就包含了具体的编译指导语句,包括parallel, for, parallel for, section, sect ions, sin gle, master, critical, flush, ordered 和atomic。

相关主题