▶ 总体印象:适合 OpenCL 入门的书,有丰富的代码和说明,例子较为简单。先把 OpenCL 代码的基本结构(平台 → 设备 → 上下文 → 命令队列 → 创建缓冲区 → 读写缓冲区 → 编译代码 → 创建程序 → 创建内核 → 设定内核参数 → 执行内核 → 缓冲区读写 → 回收检查结果)定死了,在围绕这个结构展开算法和应用。
▶ 第一章,并行编程入门
● 开放计算语言(Open Computuing Language,OpenCL)
● 设备语言可以高效映射到众多的内存系统构架上;主机端语言的目标是以较低的开销来高效管理复杂点的并行程序。两者共同为开发人员提供了一种从算法设计高效过渡到实现的途径。
● 并发性(Concurrency)考虑的是同时发生两个或两个以上的活动。并行性(Parallelism)指的是以提高总体性能为明确目标,并行进行两个或两个以上任务。并行程序必须有并发性,但是并发程序不一定要保证并行性。
●支持完全一致的共享内存模型,会在硬件上有较大开销,因为共享总线式设计瓶颈。
● 粒度,定义为计算与通信之比。并行粒度首先与应用程序算法的内在特性。
■ 细粒度的并行,计算强度低;没有租后的任务来隐藏长时间的异步通信耗时;容易通过提供大量可管理的工作单元来实现负载均衡;如果粒度过细,则可能人物之间的通信和同步开开销过大
■ 粗粒度的并行,计算强度高;完整的应用可以作为并行的粒度;难以有效实现负载均衡
● 程序实现指令集的细粒度并行,如超长指令字(VLIW)和超标量体系结构
▶ 第二章,并行编程入门
● OpenCL 规范有四个部分组成:平台模型,设备模型,内存模型,变成模型
● OpenCL 中编程人员的默表示尽可能细粒度地表示程序中的并行性,在计算单元上运行的 kernel 程序的每个实例都称为一个工作项(work-item)
● 工作项与工作组
● 上下文(Context)是一个抽象容器,存在于主机端,用于协调主机设备之间的交互,管理设备上可用的内存对象,跟踪每个设备新建的 kernel 程序。
● 命令队列(Command Queue)是主机端用于向设备端发送请求的行为机制,每个命令队列只能关联一个设备。
● 时间(Event),任何进入命令队列的操作都可以标记为一个事件,用以表示任务依赖关系(规定任务之间的拓扑顺序和阻塞)和提供程序剖析机制。
● 函数 clFinish() 阻塞直到命令队列中所有任务完成,函数 clFlush() 阻塞直到命令队列中所有任务都被移出任务队列,但不保证任务都执行完成。
● OpenCL 软件仅被链接到一个公共的运行层(ICD),所有平台特定的 SDK 通过一个动态库接口委托给某个厂商的运行时。
● 内存模型,注意关键字 __global,__constant,__local
● OpenCL 内存模型与 AMDGPU 内存的关系
▶ 第三章,OpenCL 设备架构
● SIMD 和超长指令字(Very Long Instruction Word,VLIW)构架尝试荣国提高算术操作逻辑电路的比例,进一步提高有效任务的数量;多线程方法通过增加可用的有效任务数量来占用计算逻辑部件,以隐藏其他使用非计算部件的时间,比如访问流水线。
● CMOS 动态功耗公式:P = ACV2F + Ileak 。A 为活动因子,电路中正在切换的晶体管数量;C 为电路电容量;V 为电路电压;F 为切换频率; Ileak 为估计的晶体管漏电电流。
● VLIW 通病是运行效率会因为编译器不能填满包而损失,这可以归结为编译器能力有限或指令缺乏内在的并行性
● SIMD 和向量并行是直接允许硬件指令参与数据并行执行,通产采用数据流水的形式进行计算而不是同时对所有数据单元进行操作。
● 同时多线程(Simultaneous Multithreading,SMT)通过扩展超标量调度逻辑电路来记录指令间的依赖关系和源线程,从而使得多线程指令在资源上交叉执行。
● 介绍了多种 CPU 和 GPU 的体系结构,没有细读。
● 几种并行的方式:
■ 汇编指令流的乱序执行
■ 汇编指令流的乱序执行,在结合第二个线程之后同时执行
■ 两个线程通过轮转时间片来调度执行
■ VLIW 乱序执行
■ SIMD 顺序调度,多个 ALU 上执行
▶ 第四章,OpenCL 基本实例,见代码堆,没有散点笔记
来源:https://www.cnblogs.com/cuancuancuanhao/p/8620783.html