opencl basics

2019-02-21  本文已影响0人  wywindz

1,适应平台
OpenCL是一个实现并行计算的编程框架,适应于CPU, GPU, DSP, FPGA

2,OpenCL架构
概念层:

3,Platform Model
host <——> compute devices
host一般是CPU
Compute devices可以是CPU, GPU, DSP, FPGA
几层概念:
device —> compute unit —> processing element
每个物理核只有一个CU,每个CU有一个或多个PE

每一个OpenCL的实现都定义了一个“platform”,多个制造商的platform可以由一个host来控制
制造商会提供ICD:installable client driver model

编程时:
(1)包含头文件 CL/cl.h
(2)加载lib:libOpenCL.so
(3)ICD定义文件和平台专用的OpenCL库(devices制造商提供),一般位于/etc/OpenCL/vendors/
(4)运行时机制

4,GPU上的线程管理

线程管理的模型

调度器:
Block Scheduler — 将work-items分配到SM上,使用类似于round-robin方法实现负载均衡
Warp/Wavefront — Warp(Nvidia)将32个work-items同时调度和执行,而Wavefront(AMD)将64个work-items同时调度和执行

5,Execution Model
host — 执行host程序
device — 执行kernel
device上的层级:NDRange -> work-group -> work-item (grid -> block -> thread)
host定义Context
host管理Queues

6,Memory Model
首先,参与计算的所有memory包括:host端的memory,device端的memory;
其中device端的memory包括global and constant memory,以及work-group内的local memory,以及work-item内的private memory;
这几个memory的访问权限也不相同,
Host可以访问global和constant memory,不可以访问local和private memory;
kernel可以访问global,constant,local,private memory,对constant memory只读;

7,Programming Model
两种并行方案:
数据并行(适应GPU)
严格1:1映射,每个work-item对应一个data element
其他灵活的映射方案也是允许的
任务并行(适应多核CPU,多CPU)
单kernel实例的执行,并行方法:SIMD(通过OpenCL 向量数据类型),queue多任务异步执行

8,OpenCL Host端的基础编程步骤
(1)搞清楚异构计算系统的各个计算设备
(2)熟悉各个计算设备的属性
(3)编译和配置OpenCL kernels(编程语言OpenCL C)
(4)创建和初始化memory objects(例如buffers,images)
(5)在合适的计算设备上以正确的顺序执行kernels
(6)收集计算结果

9,OpenCL Host API
基本调用流程

10,OpenCL for Compute Kernels
关于OpenCL C语言的一些介绍:
继承自从ISO C99
一些限制:没有递归,没有函数指针,没有C标准库函数
支持预处理(如#include)
内置数据类型:向量、指针、图像
必要的内置函数
可选的内置函数
函数限定符:__kernel 指定函数为kernel函数
地址空间修饰符:__global, __local, __constant, __private
Work-item函数:get_work_dim(), get_global_id(), get_local_id(), get_group_id()
在同一个work-group中的所有work-item必须同时执行barrier函数
同步函数:Barries — barrier(cl_mem_fence_flags flags)
memory fences — mem_fence(cl_mem_fence_flags flags)

上一篇下一篇

猜你喜欢

热点阅读