opencl basics

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

2,OpenCL架构
概念层:

  • Platform model
  • Execution model
  • Memory model
  • Programming model
    编程层
  • OpenCL Platform API
  • OpenCL Runtime API
  • OpenCL C(编程语言)

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)运行时机制

  • libOpenCL.so是动态链接的
  • ICD 需要使用dlopen(..)来加载平台所需的OpenCL库
  • 以上步骤完成后,调用OpenCL的库函数才能指向正确的实现

4,GPU上的线程管理

  • Kernel的概念 --- 是在Device上执行的一个函数,多个kernel实例可以在并行线程上同时运行
  • 线程数可多达上千个

线程管理的模型

  • 上层:Grid (等同于NDRange)=> Device
  • 中间层:Block (等同于work-group)=> Streaming Multi-Processor
  • 底层:Thread (等同于work-item)=> Streaming Processor
    总结:Grid包含Block包含Thread

调度器:
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
基本调用流程

  • Query platforms
    cl_int clGetPlatformIDs(cl_uint num_entries, cl_platform_id * platforms, cl_uint *num_platforms)
  • Query devices of the platforms
    cl_int clGetDeviceIDs(...)
  • Create context for the devices — 面向devices
    cl_context clCreateContext(...)
  • Create queue ( for context and device ) — 面向context和某个device
    cl_command_queue clCreateCommandQueue(...)
  • Create program object (for context) <— from C string
    cl_program clCreateProgramWithSource(...)
    Compile program
    cl_int clBuildProgram(...)
    Create kernel
    cl_kernel clCreateKernel(...)
  • Create memory objects (within context)
    cl_mem clCreateBuffer(…)
  • Kernel Execution
    Set kernel arguments
    cl_int clSetKernelArg(...)
    Put kernel into queue
    cl_int clEnqueueNDRangeKernel(...)
  • Copy memory objects with results from device to host
    cl_int clEnqueueReadBuffer(...)
  • Clean up
    cl_int clReleaseContext(clContext context)
    cl_int clReleaseCommandQueue(cl_command_queue command_queue)
    cl_int clReleaseProgram(cl_program program)
    cl_int clReleaseKernel(cl_kernel kernel)
    cl_int clReleaseMemObject(cl_mem memobj)

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)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容

  • 名词的概念: 1、cl_int clGetPlatformIDs (cl_uint num_entries,cl_...
    Binqi_zhang阅读 462评论 0 0
  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 2,694评论 0 3
  • 践行开始是刚自己定了3个目标,一,早睡早起,二,坚持跑步,三坚持阅读(90天读二本书),在践行的前段时间...
    szlong828阅读 219评论 1 1
  • 有人善长写文章,有人善长写诗。其实写文章写诗相通,相互并存,并不矛盾。 写文章能陶冶情操,修身养性。写人记事,讲的...
    潘公阅读 472评论 0 3