《OpenCL异构并行计算:原理、机制与优化实践》笔记(二):进入OpenCL的世界(矢量加法)

[题外话]近期申请了一个微信公众号:平凡程式人生。有兴趣的朋友可以关注,那里将会涉及更多更新OpenCL+OpenCV以及图像处理方面的文章。


第1章       进入OpenCL的世界(矢量加法)

1、   OpenCL执行流程

《OpenCL异构并行计算:原理、机制与优化实践》笔记(二):进入OpenCL的世界(矢量加法)

2、   获取系统平台列表的函数:

Cl_int clGetPlatformIDs(cl_uint num_entries, cl_platform_id*platforms, cl_uint *num_platforms)

3、   获取平台的属性信息:

Cl_int clGetPlatformInfo(cl_platform_id platform, cl_platform_infoparam_name, size_t param_value_size, void *param_value, size_t*param_value_size_ret)

4、   获取设备列表:

Cl_int clGetDeviceIDs(cl_platform_id platform, cl_device_typedevice_type, cl_uint num_entried, cl_device_id *devices, cl_uint *num_devices)

5、   获取设备属性信息:

Cl_int clGetDeviceInfo(cl_device_id device, cl_device_infoparam_name, size_t param_value_size, void *param_value, size_t*param_value_size_ret)

6、   上下文为关联的设备、内存对象、命令队列、程序对象、内核对象提供一个容器。上下文是OpenCL应用的核心。对于上下文中关联的所有计算设备必须全都来自于同一平台,对于来自不同平台的OpenCL设备,需要为各个平*立地创建上下文。

 《OpenCL异构并行计算:原理、机制与优化实践》笔记(二):进入OpenCL的世界(矢量加法)

7、   创建上下文的函数:

Cl_context clCreateContext(const cl_context_properties *properties,cl_uint num_devices, const cl_device_id *devices, void (CL_CALLBACK*pfn_notify)(const char*, const void*, size_t, void*), void *user_data, cl_int*errcode_ret)

Cl_context clCreateContextFromType(const cl_context_properties*properties, cl_device_type device_type, void (CL_CALLBACK *pfn_notify)(constchar*, const void*, size_t, void*), void *user_data, cl_int *errcode_ret)

8、   获取上下文属性信息:

Cl_int clGetContextInfo(cl_context context, cl_context_infoparam_name, size_t param_value_size, void *param_value, size_t*param_value_size_ret)

9、   每条命令队列只能关联一个设备,如果要同时使用多个设备,则需要创建多个命令队列,每个命令队列关联到一个设备。

《OpenCL异构并行计算:原理、机制与优化实践》笔记(二):进入OpenCL的世界(矢量加法)

10、             命令队列中的命令,只能是主机发送给设备,而设备不能发送命令给主机。

11、             创建命令队列的函数:

Cl_command_queue clCreateCommandQueueWithProperties(cl_contextcontext, cl_device_id device, const cl_queue_properties *properties, cl_int*errcode_ret)

12、             获取命令队列属性信息:

Cl_int clGetCommandQueueInfo(cl_command_queue command_queue,cl_command_queue_info param_name, size_t param_value_size, void *param_value,size_t *param_value_size_ret)

13、             对于内核对象而言,一个内核对象代表的就是一个在设备上执行的函数;而对于程序对象而言,一个程序对象就是内核的一个容器。

14、             一个程序对象包含了对所有指定cl源文件编译、构建后的一个二进制目标对象。而一个内核对象则表示其中某一个内核执行函数。

15、             创建程序对象的函数:

Cl_program clCreateProgramWithSource(cl_context context, cl_uintcount, const char **strings, const size_t *lengths, cl_int *errcode_ret)

Cl_program clCreateProgramWithBinary(cl_context context, cl_uintnum_devices, const cl_device_id *device_list, const size_t *lengths, constunsigned char **binaries, cl_int *binary_status, cl_int *errcode_ret)

16、             构建程序对象的函数:

Cl_int clBuildProgram(cl_program program, cl_uint num_devices, constcl_device_id *device_list, const char *options, void(CL_CALLBACK*pfn_notify)(cl_program program, void *user_data), void *user_data)

17、             编译程序对象的函数:

Cl_int clCompileProgram(cl_program program, cl_uint num_devices, constcl_device_id *device_list, const char *options, const_cl_program *input_header,const char **header_inlcude_name, void(CL_CALLBACK *pfn_notify)(cl_programprogram, void *user_data), void *user_data)

18、             链接程序对象的函数:

Cl_program clLinkProgram(cl_context context, cl_uint num_devices,const cl_device_id *device_list, const char *options, cl_uintnum_input_programs, const cl_program *input_programs, void(CL_CALLBACK*pfn_notify)cl_program(program, void *user_data), void *user_data, cl_int*errcode_ret)

19、             获取程序对象编译信息的函数:

Cl_int clGetProgramInfo(cl_program program, cl_program_infopram_name, size_t param_value_size, void *param_value, size_t*prame_value_size_ret)

20、             内核对象可以是一个通过命令队列发送到设备上执行的函数。

21、             创建内核对象的函数:

Cl_kernel clCreateKernel(cl_program program, const char *kernel_name,cl_int *errcode_ret)

Cl_int1 clCreateKernelIsInProgram(cl_program program, cl_uintnum_kernels, cl_kernel *kernels, cl_uint *num_kernels_ret)

22、             设置内核参数的函数:

Cl_int clSetKernelArg(cl_kernel kernel, cl_uint arg_index, size_targ_size, const void *arg_value)

Cl_int clSetKernelArgSVMPointer(cl_kernel kernel, cl_uint arg_index,const void *arg_value)

Cl_int clSetKernelExecInfo(cl_kernel kernel, cl_kernel_exec_infoprame_name, size_t prame_value_size, const void *param_value)

23、             获取内核对象的属性信息:

Cl_int clGetKernelInfo(cl_kernel kernel, cl_kernel_info prame_name,size_t prame_value_size, void *param_value, size_t *prame_value_size_ret)

Cl_int clGetKernelWorkGroupInfo(cl_kernel kernel, cl_device_iddevice, cl_kernel_work_group_info prame_name, size_t param_value_size, void*pram_value, size_t *param_value_size_ret)

24、             获取内核对象的参数信息:

Cl_int clGetKernelArgInfo(cl_kernel kernel, cl_uint arg_index,cl_kernel_arg_info param_name, size_t param_value_size, void *param_value,size_t *param_value_size_ret)

25、             内核对象加入队列的函数:

Cl_int clEnqueueNDRangeKernel(cl_command_queue command_queue,cl_kernel kernel, cl_uint work_dim, comst size_t *global_work_offset, constsize_t *global_work_size, const size_t *local_work_size, cl_uintnum_events_in_wait_list, const cl_event *event_wait_list, cl_event *event)

26、 内核函数使用kernel修饰符来限定,并且内核函数不能有返回值,只能是void类型。