OpenCL学习笔记(6)--工作项、工作组和数据划分

1.工作项的大小和偏移量:
(1)函数clEnqueueNDRangeKernel的参数global_work_sizes表示的是各个维度上所要处理的工作项的数量。如果需要访问的第一个工作项的全局(初始值)ID为{0,2,3},只需要将函数clEnqueueNDRangeKernel的参数global_work_offset取值设为{0,2,3}即可。一般代码都将global_work_offset的取值设为NULL.

2.工作组和计算单元:工作组是由访问相同处理资源的工作项组成,在编程时,工作组有两个重要的优势:
(1)工作组中的工作项可以访问高速内存(也称为局部内存)的同一块内存;
(2)工作组中的工作项可以通过栅栏(fence)和障碍(barrier)的方式来进行同步。

3.除了全局ID外,各个工作项都还有一个局部ID,用来区别同一个工作组中其他的工作项。一个工作组中工作项的数量可以通过设置函数clEnqueueNDRangeKernel的参数local_work_size的取值来实现。这个数组中各个元素分别表示的是工作组在各个维度上的数据项的分配。

4.能够支持工作组的处理资源被称为处理单元。各个工作组都可以在单个处理单元上执行,而各个处理单元一次只能执行一个工作组。

5.创建工作组并非是必须的,如果参数local_work_size的取值被设为NULL,opencl将决定如何在设备上的处理单元间分配工作项。

6.opencl提供了一个内存对象,cl_mem结构,作为主机和设备之间数据传输的基本载体。内存对象的传输过程很简单:先是通过存在的数据创建内存对象,然后调用函数clSetKernel将这个内存对象设置为内核参数。这样,内核在执行过程中,便可以将其作为函数参数来访问。如果设备还需要传输数据回主机,或将数据复制到另外的缓存对象中的需要,主机可以另外再发送相应的命令。

7.内存对象共有两种。缓存对象以一维的形式保存普通数据:图像对象以二维或三维的形式保存格式化的像素点数据。针对这两种不同的对象,OPENCL分别提供了相应的函数入列数据传输命令。尽管读/写函数针对的都是设备上的内存对象和主机之间的数据传输,但也可以通过将设备上的内存对象映射到主机内存中,来提高计算性能。

8.数据划分是每一个高性能opencl应用程序所不可回避的问题,分割操作的基本单元是工作项,对应的是传统C/C++程序中的每次迭代。每一个工作项都会有一个全局ID,用来标识代码所访问的数据位置。如果工作项之间还需要进行同步化处理,那么,就需要对这些工作项进行工作组划分,各个工作组将会分配到设备上相应的计算单元来执行。

发布了19 篇原创文章 · 获赞 20 · 访问量 571

猜你喜欢

转载自blog.csdn.net/INFINALGEORGE/article/details/105135095