用OpenCL来编程的一个整体的框架:
- 创建上下文。
- 这个部分包括获取平台,然后选择设备创建上下文。
- 主要函数 :
- clGetPlatformIDs 、clGetPlatformInfo和 clGetDeviceIDs、 clGetDeviceInfo 和clCreateContext、clCreateContextFromType、clGetContexInfo、clReleaseContext
- 创建命令队列
- 命令队列是设备之间进行通信的通道,将要在设备上完成的操作要在命令队列中排队。
- 主要函数:
- CreateCommandQueue、clReleaseCommandQueue
- 创建和编译程序
- 需要把.cl的kernel函数传入到OpenCL的c源代码中,然后创建程序对象。
- 主要函数:
- clCreateProgramWithSource、CreateProgram、clCreateProgramWithBinary、clGetProgramInfo
- clBuildProgram、clGetProgramBuildInfo、clReleaseProgram
- 创建内核对象和设置内核参数
- 创建真正的内核对象,并设置内核参数,使kernel在设备上运行。
- 主要函数
- clCreateKernel、clSetKernelArg、clCreateKernelsInProgram、clGetKernelInfo、clGetKernelWorkGroupInfo、clReleaseKernel
- 创建内存对象
- 创建设备内存
- 主要函数:
- clCreateBuffer、clReleaseMemObject、clCreateSubBffer、clGetMemObjectInfo
- 执行内核
- 设置相应的工作组和工作项,执行内核
- 主要函数:
- clEnqueueNDRangeKernel
- 复制结果
- 设备内存和主机内存之间的数据传输
- 主要函数:
- clEnqueueWriteBuffer、clEnqueueReadBuffer、clEnqueueCopyBuffer、clEnqueueMapBuffer、clEnqueueUnmapMemObject
注意:当使用clCreateContextFromType的时候,先是得到平台,然后根据相应的平台和相应的cl_device_type来生成上下文,然后再在上下文中来寻找相应的设备。
使用clCreateContext时,先得到平台,然后根据平台得到相应的设备,然后在根据设备来生成上下文。