多核多线程

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1、CMP的概念:单芯片多处理器、片上多核处理器。

单芯片多处理器(Chip Multiprocessors,简称CMP),CMP是由美国斯坦福大学提出的,其将大规模并行处理器中的SMP(对称多处理器)集成到同一芯片内,各个处理器并行执行不同的进程。

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

2、并行计算的弗林分类:单指令流单数据流(SISD)、单指令流多数据流(SIMD)、多指令流单数据流(MISD)、多指令流多数据流(MIMD)

3、进程与线程的关系:

●程序是指令的有序集合,是一个静态的概念。

●进程是正在被执行的程序,是系统进行资源分配和调度的一个独立单位,

是一个动态的概念。

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

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

●每个进程至少包含一个主线程,负责对进程进行初始化并开始执行初始

指令,创建其他子线程。

●单个进程可能包含若干个线程,这些线程都并发或并行地执行进程地址

空间中的代码。

●每个进程至少拥有一个线程,来执行进程的地址空间中的代码。当创建

一个进程时,操作系统会自动创建这个进程的第一个线程,称为主线程。进程与线程的主要区别在于:

进程拥有独立的地址空间,而线程和其他线程共享进程的地址空间。

进程之间的通信可以使用操作系统原语或通过共享存储空间来实现,而线程使用当前程序设计语言的原语或者通过进程共享空间来实现通信。

进程上下文的切换是重量级的,进程所有状态都要保存。而线程之间的切换是轻量级的,只需要保存当前寄存器的状态。

6、分解模式:

任务分解:两个园丁分别完成各自功能,但在工作中也需要项目协调,两个园丁不能对同一个地方又翻地又除草。

数据分解:将草坪划分成两半,各自完成一半草坪的翻地和除草工作。

数据流分解:一个园丁承担准备工具任务,他要完成为割草机加油,清扫剪刀等工作。直到这些准备工作就绪后,其他工作才能开始。

7、相关性性分析

处理任务之间的数据依赖关系的战略:变量本地化、改造变量、规约、明确的同步机制

8、常用的同步机制(临界区、信号量、互斥量、栅障)

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

临界区(critical section)

多个进程均需要访问的变量称为公共变量(shared variable) ;

访问共享变量的程序段称作临界区域(critical region),也称为临界段(critical section)。

一种防止多个线程同时执行一个特定代码段的机制。

适用于多个线程操作之间没有先后顺序但要求互斥的同步。多个线程访问同一个临界区的原则:

一次最多只能一个线程停留在临界区内。

不能让一个线程无限地停留在临界区内,否则其他线程将不能进入该临界区。信号量(semaphore)

包括一种称作信号灯类型的变量以及对于此种变量所能进行的两个操作:即P(wait,减量操作)操作和V(signal,增量操作)操作。

互斥量(mutex)

通常用于协调多个线程或进程的活动,通过“锁定”和“取消锁定”资源,控制对共享资源的访问。信号量是一个核心对象,拥有一个计数器,可用来管理大量有限的系统资源。当计数值大于零时,信号量为有信号状态;当计数值为零时,信号量处于无信号状态。

信号对象允许同时多个线程对共享资源进行访问,在创建对象时指定最大可同时访问的线程数。

当一个线程申请访问成功后,信号对象中的计数器减一,调用ReleaseSemaphore函数后,信号对象中的计数器加一。

计数器值大于或等于0,但小于或等于创建时指定的最大值。

如果一个应用在创建一个信号对象时,将其计数器的初始值设为0,就阻塞了其他线程,保护了资源。等初始化完成后,调用ReleaseSemaphore函数将其计数器增加至最大值,则可进行正常的存取访问。

栅障(barrier)

9、互斥量

线程互斥是指对于共享资源,在各线程访问时的排它性。

线程互斥是线程之间所发生的一种间接性相互作用,这种相互作用是进程本身不希望的,也是运行线程感觉不到的。线程互斥可能发生在相关线程之间,也可能发生在不相关进程之间。

互斥量(Mutex)作为一种互斥设备,有两个状态,上锁和空闲。同一时刻只能有一个线程能够对互斥量加锁。对于一个已经被加锁的互斥量,当另外一个线程试图对它加锁时,该线程会被阻塞,直到该互斥量被释放。

互斥量是一种锁,线程对共享资源进行访问之前必须先获得锁,否则,线程

保持等待状态,直到锁可用,只有其他线程都不占有它时,一个线程才可以占有它。占有锁的过程叫做锁定或者获得互斥量。

互斥对象在同一时刻只能被一个线程占用。

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

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

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

10、死锁和活锁

•锁不具有可组合性。不能保证由两部分以锁为基础能正确运行的代码合并得到的程序依然正确。而小程序库合并成大程序的组装能力是现代软件开

发的基础。

•假设两个线程分别已经获得锁A和锁B,此时如果两个线程都试图获取对方的锁,就发生死锁。

•当某个线程试图获取两个以上共享资源的独占访问权时,可能会发生死锁。

11、Intel设计的并行开发流程四个阶段是什么,每一个Parallel Studio组件对应在哪个阶段使用?

DESIGN (Advisor)、CODE&DEBUG(Composer)编译器、VERIFY确认(Inspector)检查器、TUNE优化(Amplifier)

12、内核对象:内核对象有线程对象、互斥量,临界区不是内核对象

●内核对象是由操作系统内核分配的,只能由内核访问的一个内存块,用来

供系统和应用程序使用和管理各种系统资源。

●内核对象包括存取符号对象、事件对象、文件对象、作业对象、互斥量、

管道对象、进程对象、信标对象、线程对象和等待计数器对象等。

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

●内核对象只能被内核程序访问,应用程序无法在内存中找到这些数据结构

并直接改变它们的内容。

13、句柄

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

14、WIN32多线程API:CreateThread( LPSECURITY_ATTRIBUTES ThreadAttributes, DWORD StackSize, LPTHREAD_START_ROUTINE StartAddress, LPVOID Parameter, DWORD CreationFlags, LPDWORD ThreadId ); CloseHandle(HANDLE hObject);DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds );(线程之间的等待、互斥量加锁)参数1:hHandle表示一个能够支持已通知/未通知状态的内核对象;参数2:dwMilliseconds指为了等待该对象变为已通知状态,将等待多长时间。CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes,BOOL bInitialOwner,LPCTSTR lpName);ReleaseMutex(hMutex);EnterCriticalSection(&cs);LeaveCriticalSection(&cs);

15、书P67 OpenMP编程简介

16、OpenMP的编译指导语句:循环并行化 #pragma omp parallel for private(j) reduction(+:sum)

17、独立于体系结构性能优化方法主要有:

避免冗余的函数调用

相关文档
最新文档