多核程序设计_第1页
多核程序设计_第2页
多核程序设计_第3页
多核程序设计_第4页
多核程序设计_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计算机的发展按照硬件工艺可以分为 第一代( 19461958):电子管数字计算机。 第二代( 19581964):晶体管数字计算机。 第三代( 19641971):集成电路数字计算机。 第四代 (1971 年以后):大规模集成电路数字计算机。现代计算机发展历程可以分为两个明显的发展时代: 串行计算时代 并行计算时代。并行计算机是由一组处理单元组成的, 这组处理单元通过相互之间的通信与协作, 以更快的 速度共同完成一项大规模的计算任务。并行计算机个最主要的组成部分 :计算节点 节点间的通信与协作机制Flynn 根据指令流和数据流的不同组织方式,把计算机系统的结构分为以下四类: 单指令流单数据流(

2、 SISD) 单指令流多数据流( SIMD ) 多指令流单数据流( MISD ) 多指令流多数据流( MIMD ) 指令流( instruction stream ) 指机器执行的指令序列 数据流( data stream) 指指令流调用的数据序列,包括输入数据和中间结果。SISD 计算机是传统的顺序执行的计算机在同一时刻只能执行一条指令 (即只有一个控制流 )、处理一个数据 ( 即只有一个数据流 )。 缺点:单个处理器的处理能力有限 没有并行计算能力在 MIMD 计算机中没有统一的控制部件。在 SIMD 机中,各处理单元执行的是同一个程序, 而在 MIMD 机上,各处理器可以独立执行不同的程

3、序。 MIMD 结构比 SIMD 结构更加灵活。SIMD 计算机用于对不同数据的相同运算(向量和矩阵运算) 而 MIMD 计算机可以适应更多的并行算法从系统结构的角度来分类,一般有以下几种:1)对称多处理器( SMP )2)分布式共享存储多处理机( DSM )3)大规模并行处理机( MPP )4)并行向量处理机( PVP)5)集群计算机。加速比用于衡量统一问题并行后的执行时间与最佳串行执行时间相比较的效果。 公式加速比 = 串行时间 / 并行时间粒度表示程序处理数据的规模处理的数据相对较多,称粗粒度反之称为细粒度 恰当粒度会对加速比的提高起作用 负载平衡 分配给多个线程的工作量大致相同 有效的

4、分配 :线程执行相同的工作量 各线程尽可能同时结束 相关性分析共享 要进行同步 降低效率解决方法: 减少共享数据的访问 变共享为私有,消除数据的相关性数据竞争竞争是并行程序的常见问题 不通过同步保证程序执行的顺序 ,会引发数据竞争。数据竞争表现:内存访问冲突 . 两种可能的冲突 读写冲突 写写冲突多线程的层次用户级多线程 (User Level Thread) 在用户层通过线程库来实现 内核级多线程 (Kernel Level Thread) 由操作系统直接支持组合多线程、用户级线程优点:用户级线程有关线程的所有管理工作都由在用户级实现的线程库来支持 用户级线程的创建和管理等操作无须内核参与,

5、操作更快 用户级线程缺点:并行性不高一个线程被系统阻塞后,整个进程被阻塞内核级线程内核级线程的所有管理操作都是由操作系统内核完成特点并行性高多个线程可被同时调度充分利用多处理器创建和管理代价高混合多线程用户创建的多个用户级线程被映射到一些内核线程上,内核线程的数目可能少于用户级线程的数目。线程的生命周期线程的标识通常用一个整数来标识一个线程线程的创建自动创建从main函数开始的主线程调用函数库接口创建一个新的线程(pthread_create)线程的终止执行完毕,或者调用了pthread_exit主线程退出导致整个进程会终止 线程的状态就绪(ready):线程等待可用的处理器。运行(runni

6、ng):线程正在被执行。I/O的完成,试图加锁一个被上锁的pthread_exit。阻塞(blocked):线程正在等待某个事件的发生(比如 互斥量)。调度终止(term in ated):线程从起始函数中返回或者调用被创建就绪条件满足完成终止创建一个新的信号量原型:HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTESlpSemaphoreAttributes, / SDLONG lInitialCount, / initial countLONG lMaximumCount, / maximum countLPCTSTR lpName / object n

7、ame);(1) lpSemaphoreAttributes : 定义了信号量的安全特性NULL 表示采用默认描述符。(2) lInitialCountLong信号量的初始计数可设置值 : 0 (lMaximumCount-1)(3) lMaximumCountLong信号量的最大计数(4) lpName字符串 信号量对象的名称NULL : 创建一个未命名的信号量对象 返回值(1) HANDLE ,如执行成功,返回信号量对象的句柄(2) 返回 0 表示出错说明:(1) 一旦不再需要,一定记住用 CloseHandle 关闭信号量的句柄。(2) 一旦可用资源数量值大于零,信号量就会触发。可以使用

8、ReleaseSemaphore函数来增加信号量的计数用于对指定的信号量增加指定的值; 原型:BOOL ReleaseSemaphore(HANDLE hSemaphore,LONG lReleaseCount,LPLONG lpPreviousCount);(1) hSemaphore所要操作的信号量对象的句柄(2) lReleaseCount 信号量对象“当前资源数量”在当前基础上所要增加的值,这个值必须大于通常设为 1,使“当前可用资源数量”加1那么这个信如果信号量加上这个值会导致信号量的当前值大于信号量创建时指定的最大值, 号量的当前值不变,同时这个函数返回 FALSE0(3) lpP

9、reviousCount 指向 用于得到 信号量上次的值 的变量的指针 ; 如果不需要信号量上次的值,可以设置为 NULL返回值:成功返回 TRUE 失败返回 FALSE创建一个事件对像。HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes,/安全属性BOOL bManualReset,/ 复位方式BOOL bInitialState,/ 初始状态LPCTSTR lpName / 对象名称); 指定将事件对象创建成手动复原还是自动复原。(1) 如果是 TRUE ,人工重置的事件 必须用 ResetEvent 函数来手工将事件的状

10、态复原到无信号状态。(2) 如果是 FALSE ,自动重置的事件 当事件被一个等待线程释放以后,系统将会自动将事件状态复原为无信号状态。3 指定事件对象的初始状态。 如果为 TRUE ,初始状态为有信号状态;否则为无信号状态。4 指定事件的对象的名称,是一个以 0 结束的字符串指针。 如果 lpName 为 NULL ,将创建一个无名的事件对象。当调用 SetEvent 时,可以将事件改为已通知状态: BOOL SetEvent(HANDLE hEvent); 参数 hEvent 表示事件对象句柄。 返回值:如果操作成功,则返回非零值,否则为 0将该事件改为未通知状态:BOOL ResetEv

11、ent(HANDLE hEvent); 参数 hEvent:in 指向事件对象的句柄。 返回值:函数成功,返回非 0 值,否则返回 0 值信号量一个包含有整数值的变量,可以初始化为非负数。 对信号量的原语操作:Wait :申请资源,信号量减 1,Sig nal :释放资源,信号量加1void wait(samephore s)s-;if (s0) 将线程插入到信号量 s 的等待队列中,并阻塞线程;void signal(samephore s)s+;if (s=0) 从信号量 s 的等待队列中移出一个线程 WaitForMultipleObjects ( ) 函数原型:DWORD WaitFo

12、rMultipleObjects(DWORD nCount,const HANDLE* lpHandles,BOOL bWaitAll,DWORD dwMilliseconds);nCount :句柄的数量 最大值为 MAXIMUM_W AIT_OBJECTS ( 64)lpHandles :HANDLE 句柄数组的指针。指向内核对象句柄类型的数组的指针。BOOL bWaitAll 等待的类型,如果为 TRUE ,等待所有信号量有效才往下执行。如果为 FALSE ,当有其中一个信号量有效时就向下执行DWORD dwMilliseconds 超时时间 超时调用线程会继续后向执行。 如果为 W 返

13、回值: 告诉调用线程,为什么它会被重新调度。 可能的返回值是 :WAIT_FAILED 和 WAIT_TIMEOUT如果 bWaitAll 参 数传 递 TRUE , 同时 所有 对 象均 变 为已 通 知状 态, 那么 返回值 是 WAIT_OBJECT_0 。如果 bWaitAll 参数传递 FALSE ,返回值是 WAIT_OBJECT_0 与( WAIT_OBJECT_0 + dwCount-1 )之间的一个值。(返回值 - WAIT_OBJECT_0)= 参数 lpHandles 句柄数组中的索引SA_INFINITE 永不超时。如果没有信号就会死等举例 1:当 bWaitAll 参

14、数为 FALSE 可以等待其中之一的事件HANDLE m_hEvent2;/ 两事件m_hEvent0=CreateEvent(NULL, FALSE, FALSE, NULL);/ 事件 0m_hEvent1=CreateEvent(NULL, FALSE, FALSE, NULL);/ 事件 1CreateThread(NULL, 0, MyThreadProc, this, 0, NULL);DWORD WINAPI MyThreadProc(LPVOID lpParam)while(TRUE) /每次等 500 毫秒int nIndex = :WaitForMultipleObject

15、s(2 , m_hEvent, FALSE,500);if (nIndex = W AIT_OBJECT_0 ) / 事件 0 /ExitThread(0); /break;else if (nIndex = W AIT_OBJECT_0+1) /事件 1 else if (nIndex = W AIT_TIMEOUT) / 超时 500 毫秒 /超时 printf( 线程结束 . /n);return 0L;举例 2:当 bWaitAll 参数为 TRUE 等待所有的事件DWORD WINAPI MyThreadProc(LPVOID lpParam)while(TRUE)/每次等 500

16、毫秒int nIndex = :WaitForMultipleObjects(2, m_hEvent, TRUE,500);if (nIndex = W AIT_OBJECT_0) / 所有事件发生/ 所有的信号量都有效时(事件都发生) ; 其中之一发生无效。OpenMP 的指令parallel:用在一个代码段之前,表示这段代码将被多个线程并行执行for: 用于 for 循环之前,将循环分配到多个线程中并行执行,必须保证每次循环之间无相关 性。Sections: 用在可能会被并行执行的代码段之前private: 指定每个线程都有它自己的变量私有副本。firstprivate :指定每个线程都有它自己的变量私有副本,并且变量要被继承主线程中的初值。lastprivate :主要是用来指定将线程中的私有变量的值在并行处理结束后复制回主线程中的对应变量。reduction :用来指定一个或多个变量是私有的,并且在并行处理结束后这些变量要执行指定的运算。n owait :忽略指定中暗含的等待num_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论