OpenCL(全称Open Computing Language,开放运算语言)是第一个面向异构系统通用目的并行编程的开放式、免费标准,也是一个统一的编程环境,便于软件开发人员为高性能计算服务器、桌面计算系统、手持设备编写高效轻便的代码,而且广泛适用于多核心处理器(CPU)、图形处理器(GPU)、Cell类型架构以及数字信号处理器(DSP)等其他并行处理器,在游戏、娱乐、科研、医疗等各种领域都有广阔的发展前景。
下面文章简单介绍编写一般OpenCL程序的流程,并将每个步骤调用的API function列出来。
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)
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2018 群英 版权所有 茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号-36 粤公网安备 44090202000006号 粤工商备P091701000595