一:多核世界中的软件
1:并发性
软件系统包含多个活动的操作流(线程),若这些操作流同时推进,则称该软件是并发的。
A:并发性
在同一段时间内,一个处理器可以并发的执行多个任务--多线程交替执行
B:并行性
在同一时刻,多核处理器能够同时运行多个程序
2:并发程序设计核心
1)必须定义并发执行的操作流,并为它们关联执行时间,还要管理这些操作流之间的依赖性,保持并行运行这些操作流时可以生成正确的结果。
2)关键--高层模型
A:任务并行
多个PE几乎同时完成任务(每个PE计算所花费的时间相同)---负载平衡
B:数据并行
直接定义和处理并发任务
并行性---相同的指令流(一个任务)并发的应用到多个数据,体现在数据
二:概念基础
面向异构平台的应用需要完成6个步骤:
1:平台模型
一个宿主机以及一个或多个opencl设备(执行指令流或内核的地方,含有一个或多个计算单元(含有一个或多个处理单元 ))
2:执行模型
1)opencl应用
(1个)宿主机程序(宿主机运行)+(1或多个)内核(简单的函数,opencl运行)
2)opencl定义的内核
原生内核(非opencl编写)+opencl内核(opencl编写且在opencl编译器编译)
3)内核如何在opencl上执行
宿主机通过提交命令使内核在opencl上运行,与此同时opencl运行---系统创建一个整数索引空间。
opencl只能确保一个工作组中的工作项并发执行,和共享设备上的处理器资源。
A:工作项
执行内核的各个实例---给定工作组中的工作项会在一个处理单元上并发执行
B:工作组
工作项组织
C:索引空间
N维值网格
D:局部索引空间
一个工作组内的空间
1 二维的索引空间实例 2 大小:GxXGy 工作组个数:(Wx,Wy) 工作组索引(wx,wy) 3 工作组大小:(Lx,Ly)--Lx=Gx/Wx,Ly=Gy/Wy 4 5 工作项局部ID:(lx,ly)则全局ID:gx=wx*Lx+lx,gy=wy*Ly+ly 6 由(gx,gy)恢复局部ID:lx=gx%Lx,ly=gy%Ly,组ID:wx=gx/Lx,wy=gy/Ly 7 8 注意定义偏移量后需要加上。
E:上下文
定义程序运行的环境和资源---(设备(内核(程序对象(内存对象))))
由宿主机使用OPENCL api创建并管理
F:命令队列
由宿主机创建,并在定义上下文后关联到一个opencl设备
(1)opencl支持的命令
内核执行命令/内存命令/同步命令
(2)命令执行模式
有序执行/乱 序执行(需要显式的使用同步机制来强制顺序执行,实现负载平衡,使所有计算单元得到充分利用并同时完成任务 )
自动负载平衡---若一个PE很快完成了它的工作就立即可以从命令队列获取一个命令执行一个新的内核
3:内存模型
1)内存对象
图像对象/缓冲区对象(内核可用的一个连续的内存区)
2)内存区域
宿主机内存/全局内存/常理内存/局部内存(一族工作项看到的值在工作组中同步点是一致的)/私有内存(仅工作项可见)
3)宿主机和opencl设备交互方式
显式地复制数据/映射和解映射内存对象的内存区域
4:编程模型
数据并行(单指令多数据/单程序多数据)/任务并行
二:opencl内容
1:框架
平台API(宿主机程序发现opencl设备所用函数及其功能+opencl应用创建上下文的函数 )
运行时API(管理上下文来创建命令队列+运行时发生的其他操作)
编程语言
2:基本工作流程
A:定义上下文的宿主机程序
B:定义命令队列
C:宿主机程序定义一个程序对象(编译内核)
D:宿主机程序定义程序所需内存对象并映射到内核的参数
E:执行