多核架构及编程技术课程总结
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{ int i=0;
// Should be add in main code body
#ifdef __INTEL_COMPILER
printf("__INTEL_COMPILER = %d\n", __INTEL_COMPILER);
#else
printf("__INTEL_COMPILER is not defined.\n");
互斥量
通常用于协调多个线程或进程的活动,通过“锁定”和“取消锁定”资 源,控制对共享资源的访问。要求各线程均使用互斥量。
信号量
信号量是一个核心对象,拥有一个计数器,可用来管理大量有限 的系统资源。当计数值大于零时,信号量为有信号状态;当计数 值为零时,信号量处于无信号状态。
Windows环境下的多线程编程
#endif
_beginthread(ThreadFunc1,0,NULL); //创建线程
_beginthread(ThreadFunc2,0,NULL);
Sleep(3000);
cout<<"end"<<endl;
return 0;
}
Windows多线程编程实例(续)
下面程序首先创建两个线程,当输入为1时,执行线程,否则挂起线程。
Windows线程库介绍
Win32 API是Windows操作系统为内核以及应用程序之间提 供的接口,将内核提供的功能进行函数封装,应用程序通 过调用相关的函数获得相应的系统功能。
MFC是微软基础函数类库(Microsoft Foundation Classes),由 微软提供的,用类库的方式将Win32 API 进行封装, 以类的 方式提供给开发者。
{
Sleep(1000);
cout<<"This is ThreadFunc1"<<endl;
}
}
void ThreadFunc2(PVOID param)
{
while(1)
{
Sleep(1000);
cout<<"This is ThreadFunc2"<<endl;
}
}
int main() //主函数
硬件线程(Hardware threads) 线程在硬件资源上的表现形式。
线程计算模型
用户级线程 由可执行应用程序使用,同时由用户级操作系统管理
执
行
内核级线程
流
由操作系统内核使用,同时由内核操作系统处理
程
硬件线程 由每个处理器使用
执行环境中的线程执行流程
ቤተ መጻሕፍቲ ባይዱ
线程定义和准备
线程运行
线程执行
由程序设计环境 和编译器完成
CPU 状态 中断逻辑
执行单元 Cache
(b) 多处理器结构
CPU 状态 中断逻辑
执行单元 Cache
CPU 状态 中断逻辑
执行单元 Cache
(d) 多核体系结构
单核、多处理器以及多核结构之间 的简单对比(二)
CPU 状态 中断逻辑
CPU 状态 中断逻辑
执行单元
执行单元
Cache
(e) 共享Cache 的多核体系结构
事件
事件是WIN32提供的最灵活的线程间同步方式,各线程 根据事件的激发状态来决定是否运行相应的线程函数。
事件存在两种状态: 激发状态(signaled or true) 未激发状态(unsignal or false)
事件可分为两类:
手动设置:这种对象只能用程序来手动设置,在需要该事件或者 事件发生时,采用SetEvent及ResetEvent来进行设置。
自动恢复:一旦事件发生并被处理后,自动恢复到没有事件状 态,不需要再次设置。
同步的机制简介(续)
临界区
一种防止多个线程同时执行一个特定代码段的机制 适用于多个线程操作之间没有先后顺序但要求互斥的同步。多个
线程访问同一个临界区的原则: 一次最多只能一个线程停留在临界区内 不能让一个线程无限地停留在临界区内,否则其他线程将不 能进入该临界区
计算机
MPP
并行粒度 进程级大粒度 线程级细粒度 进程级细粒度
并行操作方式 异步
异步
松散同步
数据存储模式 分布式存储 共享存储 共享存储
数据分配方式 显式
隐式
半隐式
学习入门难度 较难
容易
偏易
可扩展性 好
较差
一般
多线程编程
基本概念 同步问题 基于Visual Studio的多线程编程 基于OpenMP的多线程编程
线程等待
一组能使线程阻塞其自身执行的等待函数 WaitForSingleObject、WaitForMultipleObject。
线程终结
VOID ExitThread( DWORD dwExitCode);
多 线 程 编 程 举 例
// exa1.cpp : Defines the entry point for the console application. #include "stdafx.h" #include <windows.h>
L2 Cache
System Bus (667MHz, 5333MB/s)
单核、多处理器以及多核结构之间 的简单对比(一)
CPU 状态 中断逻辑
执行单元 Cache
(a) 单核结构
CPU 状态 中断逻辑
执行单元
CPU 状态 中断逻辑
Cache
(c) 超线程技术
CPU 状态 中断逻辑
执行单元 Cache
#include <process.h> #include <iostream> #include <fstream> using namespace std; // 保证标准屏幕输入/输出语句的使用
void ThreadFunc1(PVOID param)
{
while(1)
#include <windows.h> #include <iostream> using namespace std; DWORD WINAPI FunOne(LPVOID param) { while(true) {
Sleep(1000); cout<<"hello! "; } return 0; } DWORD WINAPI FunTwo(LPVOID param){ while(true) { Sleep(1000); cout<<"world! "; } return 0; }
由操作系统采用 进程完成
由处理器完成
用双向箭头表示线程在执行 之后将结果返回到用户空间
线程状态的转换
线程的同步
由于线程共享同一进程的内存空间,多个线程可 能需要同时访问同一个数据。如果没有正确的保 护措施,对共享数据的访问会造成数据的不一致 和错误。
线程同步是指线程之间所具有的一种制约关系, 一个线程的执行依赖另一个线程的消息,当它没 有得到另一个线程的消息时应等待,直到消息到 达时才被唤醒。
Bool SetThreadPriority (HANDL E hPriority , int nPriority)
线程的挂起与恢复 进程中的每个线程都有挂起计数器(suspend count) 。当挂起计 数器值为0 时,线程被执行;当挂起计数器值大于0 时,调度 器不去调度该线程。 DWORD SuspendThread(HANDLE hThread); DWORD ResumeThread(HANDLE hThread);
CPU 状态 中断逻辑
CPU 状态 中断逻辑
执行单元 Cache
CPU 状态 中断逻辑
CPU 状态 中断逻辑
执行单元 Cache
(f) 采用超线程技术的多核体系结构
与多核对应的芯片组
PPrroocceessssoorr
Front Side Bus
North Bridge / MCH (北桥)
HHiigghh--SSppeeeedd II//OO
数据共享使得线程之间的通信比进程间的通信 更高效
快速响应特性
在系统繁忙的情况下,进程通过独立的线程及 时响应用户的输入
缺点: 增加程序编写难度,增加程序复杂度。难以调试。
线程的层次
用户级线程(User-level threads ) 在应用软件中所创建和操纵的线程。
内核级线程(Kernel-level threads ) 操作系统实现大多数线程的方式。
进程(Process)概念
进程(process)
离散的(执行)程序任务集合。
一个进程包括:
进程ID,进程组ID,用户ID,组ID; 环境 工作目录 程序指令 寄存器 堆栈(Stack) 堆(Heap) 文件描述符 信号操作 共享库 进程间通信工具
线程互斥是指对于共享资源,在各线程访问时的 排它性。
常用的同步机制
全局变量 事件(Event) 临界区(critical section) 信号量(simphore) 互斥量(mutex)
同步的机制简介
全局变量
进程中的所有线程均可以访问所有的全局变量,各线程 根据全局变量的状态来决定是否运行相应的线程函数, 它是Win32多线程同步的最简单方式。
消息队列、管道、信号量、共享内存
进程示例
多线程的概念
线程(thread)是进程上下文(context)中执行的代码序 列,又被称为轻量级进程(light weight process)
在支持多线程的系统中,进程成为资源分配和保护的实 体,而线程是被调度执行的基本单元。
代码
数据
文件
寄存器
栈
代码 寄存器
栈
数据 寄存器
栈
文件 寄存器
栈
线程
线程
对于在一个进程内的线程:
•一个线程对共享的系统资源进行修 改,在这个进程内的其它线程也可以 见到这种修改。
•对于同一个数据,可能有两个值相 同的指针指向这个数据。
•进程内的多个线程可以对同一个内 存单元进行读和写操作,所以必须要 采取显式同步机制。
•在同一个进程的地址空间下,线程 间的通信消耗更小。
一个进程内的线程示例
进程与线程的关系
进程
程序在操作系统中作为进程方 式存在、获取资源、运行。
在一个进程内,线程可以创建 其它线程。每个线程有各自的 栈(stack)。
一个进程内所有的线程共享代 码段和数据段。
多线程的优点
创建一个线程比创建一个进程的代价要小 线程的切换比进程间的切换代价小 充分利用多处理器 数据共享
MIMD异步并行计算模型
异步PRAM模型 BSP模型 LogP模型 C3模型
并行编程环境
比较流行的并行编程环境主要有3类:消息传递、 共享存储和数据并行
特征 消息传递 共享存储 数据并行
典型代表 MPI, PVM OpenMP
HPF
可移植性 所有主流并行 SMP, DSM SMP, DSM,
微软Win32/MFC 线程API
•创建线程 •管理线程 •使用Windows事件进行线程通信 •线程同步 •原子操作 •线程池 •线程优先级 •处理器亲和 •带有线程支持的用户级线程机制 •Windows多线程应用程序的编译和链接
线程管理
设置线程的优先级 线程优先级 = 进程优先级 + 线程相对优先级
• PCI Express • Memory
South Bridge / ICH (南桥)
LLooww--SSppeeeedd II//OO
• PCI • Hard Disk • LAN
• USB • Audio
并行计算模型
SIMD同步并行计算模型
共享存储的SIMD模型(PRAM模型) 分布存储的SIMD模型(SIMD互联网络模型)
课程主要内容总结
多核构架 多线程编程 高性能多核编程 多核应用编程工具
多核构架
芯片组
操作系统
CPU
并行平台
CPU的Core微架构
Core1
Core2
Bus
2 MB L2 Cache
FP Unit EXE Core L1 Cache
FP Unit EXE Core L1 Cache
.NET Framework 由 两 部 分 构 成 : 公 共 语 言 运 行 库 (Common Language Runtime ,CLR)和Framework类库 (Framework Class Library ,FCL)。.NET 基础类库的 System.Threading命名空间提供了大量的类和接口来支持多 线程。所有与多线程机制相关的类都存放在 System.Threading命名空间中。