本文目的
本文将简单介绍编写一般OpenCL程序的流程,并将每个步骤调用的API function列出来。
OpenCL程序编写流程
1、获取当前存在的有效的平台(platform),实际上可以理解为device的发行商,如因特尔、AMD等。(clGetPlatformIDs)
2、选择获取到的平台中的其中一个,获取该平台当前存在的有效的设备(device),如CPU、GPU card。(clGetDeviceIDs)
3、创建OpenCL context,context可以理解为是在host上的一个抽象的容器,由它来协调host与device交互的机制,管理device可用的内存对象,并跟踪为每个device创建的程序和内核。(clCreateContext)
4、创建command queue,command queue用来对device发出host想要device去执行的一系列指令。如果是有多个device,则需对每个device创建各自的command queue。(clCreateCommandQueue)
5、创建program,program可以理解为是kernels的集合,如果要执行的kernel有多个的话,则全部放置在一个program里面。创建完成后还需要编译一下该program看看有没有存在错误。(clCreateProgramWithSource、clBuildProgram)
6、创建kernel对象,kernel对象可以理解为将当前想要执行的某个特定kernel从program里面提取出来,提取的依据是该kernel的名字。想要执行的kernel被提取出来之后还不能立即把它放置到command queue要求device去执行,而是需要先把该kernel的参数设置好(这里并不能像C语言调用函数一样去给参数,而是需要调用特定的API function去实现给参数)。(clCreateKernel、clSetKernelArg)
7、给完kernel所需的参数后就可以将它放入(enqueue)到command queue里,然后device就会接收到要求,去执行该kernel。(clEnqueueNDRangeKernel)
8、当然,除了以上步骤之外,还需按照需求穿插着和内存(memory)相关的操作,如,当需要利用buffer来储存数据时,首先要创建buffer对象,然后要将host里的数据写进buffer,写进数据的实现是将该操作放入(enqueue)command queue里;当kernel运行完成后要从kernel读出数据到host,也可通过buffer来实现,首先也是创建buffer对象,然后读出数据的实现也是通过放入(enqueue)command queue来实现。(clCreateBuffer、clEnqueueWriteBuffer、clEnqueueReadBuffer)
附
以上出现的一系列OpenCL API functions都可以在OpenCL的参考文档(reference pages)中查阅得知具体的用法。在这里附上参考文档的网址(OpenCL 1.2):
https://www.khronos.org/registry/OpenCL/sdk/1.2/docs/man/xhtml/