OpenCL: getting started
==============================================================
目录结构
1、OpenCL设备整体连接图
2、OpenCL基本点与Host主机引导流程图
2.1 OpenCL设备
2.2 OpenCL编译方式
2.3 调用核函数方式
2.4 Host程序启动流程
3、参考
==============================================================
关键词:OpenCL启动流程
OpenCL明确地分为运行在主机(host)上的程序和运行在设备(device)上的程序两部分。运行在主机上的程序我们可以称为引导程序,运行在设备上的程序称为核。
主机将控制设备如何执行计算单元;
设备则是执行计算单元的环境,比如包括包含大量计算单元的GPU,DSP,CPU,以及支持OpenCL的FPGA设备等。
前文已有OpenCL示例的运行程序,本文将对OpenCL程序启动稍做总结。
1、OpenCL设备整体连接图
图1、OpenCL整体图
图1显示了编写OpenCL设备需要的所有关键部件。
首先需要OpenCL设备,诸如CPU,GPU。这些设备是执行核函数的地方。
其次,主机需要寻找OpenCL平台,创建程序(Programs,核函数的程序),创建核函数(Kernels,并为核函数设置相关的参数),创建内存对象(Memory Objects,有Images和Buffers类型),创建命令队列(对读/写内存,已经执行核函数等动作进行排队)。
图2、Altera OpenCL平台图(一)
图3、Altera OpenCL平台图(二)
图2、图3显示了Altera OpenCL平台连接图,主机代码编译完成后加载到主机内存,核函数代码编译完成后分别加载到主机挂载的OpenCL设备(此处是Altera FPGA),该FPGA设备和主机之间通过PCIe连接。
2、OpenCL基本点与Host主机引导流程图
图4、OpenCL基本点
2.1 OpenCL设备:前面已经提及多次,CPU、GPU、DSP和FPGA等。
2.2 OpenCL编译方式:此处区别指的是,编译的时候文件来源是核函数的源代码还是二进制文件。两种编译方式使用的函数不一样。如果没有核函数,则是已经编译好的二进制文件,这种方式的灵活性差,如果要匹配很多不同的OpenCL设备,则需要提供更多的不同版本的二进制文件,当然对于保护源代码有一定作用;如果有核函数的源代码,则使用时需要重新编译,需要多花费一点编译时间,但灵活性高,且用户需要修改源代码时方便。
2.3 调用核函数方式:分为数据并行和任务并行。数据并行使用的函数为clEnqueueNDRangeKernel,任务并行使用的核函数为clEnqueueTask。
2.4 Host程序启动流程:
(1)获取平台(clGetPlatformIDs)
(2)选择设备(clGetDeviceIDs)
(3)创建上下文(clCreateContext)
(4)创建命令队列(clCreateCommandQueue)
(5)创建内存对象(clCreateBuffer)
(6)主机数据写入内存(clEnqueueWriteBuffer)
(7)读取核文件(open kernel sources)
(8)创建程序对象(clCreateProgramWithSource)
(9)编译(clBuildProgram)
(10)创建核函数(clCreateKernel)
(11)配置核函数参数(clSetKernelArg)
(12)执行核函数(clEnqueueNDRangeKernelor clEnqueueTask)
(13)从内存读取数据(clEnqueueReadBuffer)
(14)释放对象(free all the objects in order)
此处需要了解各个步骤中函数的相关参数,每次启动流程类似。可能我们需要特别关注的是以上的(5)(6)(13)标红色的步骤,因为我们创建一个OpenCL设备是为了做加速运算,存储是OpenCL设备和主机之间的接口,数据首先需要从主机通过相关函数复制到OpenCL设备里,在设备内执行完数据后,主机又需要通过相关函数获取,这才得到我们想要的结果。
3、参考
参考书籍:《The OpenCL Programming Book》
如有错误,请您斧正,谢谢阅读。
作者:途次客
来源:****
原文:https://blog.****.net/zhouxuanyuye/article/details/80037295
版权声明:本文为博主原创文章,转载请附上博文链接!