最近因项目需要跨平台做算法的加速优化,需要使用opencl来做,所以准备将opencl的东西学习一遍,学习的目的在于使用,达到通用的水平,暂时不做实现硬件的最大化水平。之前做过一些Nivida的Cuda开发,现在做opencl的开发虽然有些差别,但整体变换不大,硬件层逻辑相同,主机代码环境配置模块有所不同。先放一张opencl处理的流程图:

OpenCL支持的深度学习库 opencl教程_跨平台

    从流程上我们可以看出,主要处理有以上12哥流程:

(1)Discover and initialize the platforms
    调用两次clGetPlatformIDs函数,第一次获取可用的平台数量,第二次获取一个可用的平台。
  (2)Discover and initialize the devices
    调用两次clGetDeviceIDs函数,第一次获取可用的设备数量,第二次获取一个可用的设备。
  (3)Create a context(调用clCreateContext函数)
    上下文context可能会管理多个设备device。
  (4)Create a command queue(调用clCreateCommandQueue函数)
    一个设备device对应一个command queue。上下文conetxt将命令发送到设备对应的command queue,设备就可以执行命令队列里的命令。
  (5)Create device buffers(调用clCreateBuffer函数)
    Buffer中保存的是数据对象,就是设备执行程序需要的数据保存在其中。
    Buffer由上下文conetxt创建,这样上下文管理的多个设备就会共享Buffer中的数据。
  (6)Write host data to device buffers(调用clEnqueueWriteBuffer函数)
  (7)Create and compile the program
    创建程序对象,程序对象就代表你的程序源文件或者二进制代码数据。
  (8)Create the kernel(调用clCreateKernel函数)
    根据你的程序对象,生成kernel对象,表示设备程序的入口。
  (9)Set the kernel arguments(调用clSetKernelArg函数)
  (10)Configure the work-item structure(设置worksize)
    配置work-item的组织形式(维数,group组成等)
  (11)Enqueue the kernel for execution(调用clEnqueueNDRangeKernel函数)
    将kernel对象,以及 work-item参数放入命令队列中进行执行。
  (12)Read the output buffer back to the host(调用clEnqueueReadBuffer函数)
  (13)Release OpenCL resources(至此结束整个运行过程)
(链接:https://www.jianshu.com/p/7a48ae330e35)

至此,我们已经看到的opencl处理的流程,相对于cuda来说,确实繁琐了许多。可能正因为它的繁琐,才让它成为跨平台的原因吧,接下来的我将进行opencl的编程实战和调试方法的学习。