OpenCL学习笔记(14)--工作组和工作项函数

1.主机应用程序先设定内核数据的维度,每个维度上工作项的数量以及每个维度上各个工作组中工作项的数量,然后,调用函数clEnqueueNDRangeKernel来进行配置。当工作项开始执行时,他需要事先知道所要访问的数据所在的位置,即当前工作项在所有工作项中的ID.如果工作项还属于某个工作组,那还需要知道工作项在这个工作组中的ID.

2.维度和工作项:工作项ID的维度数就是你访问一个包含工作项数据的数组中各个元素所需要的索引数。一个工作项是内核的一种实现,每个工作项都有唯一标识符来区别运行内核的其他工作项。这个标识符就是全局ID,一个由无符号整数所组成的数组–其中的元素与数据的各个维度相对应。工作项还可以通过调用函数get_global_id来获取其全局ID.和工作项有关的函数(全局信息):
(1)uint get_work_dim() --返回内核索引空间的维度数;
(2)size_t get_global_size(uint dim)–返回给定维度上的工作项的数量;
(3)size_t get_global_id(uint dim)–返回给定维度上工作项的全局ID;
(4)size_t get_global_offset(uint dim)–返回用于计算全局ID的初始偏移量。

3.OpenCL中,循环迭代对应的是工作项,循环索引对应的是工作项的全局ID.一个工作项可以通过调用函数get_global_id(0)和函数 get_gobal_id(1)来获取其全局ID.同样,通过调用函数get_global_size(0)和函数get_global_size(1),可以知道各个维度上有多少个工作项会被执行。嵌套循环中,第一次迭代的索引对是(3,5).这个索引对应的是OpenCL的全局偏移量,而它也是第一个巩固走向的全局ID.工作项可以通过调用函数get_global_offset(0)和函数get_global_offset(1)来获取其全局偏移量。

4.工作组:如果工作项间需要同步执行,工作组就变得相当重要。函数get_global_id返回的是当前工作项在执行内核的所有工作项中的位置,而get_local_id返回的是当前工作项和同意工作组中的各个工作项间的相对位置关系。如果执行相同内核的两个工作项所在的工作组不同,那么,它们的局部ID有可能一样,但全局ID绝对不同。和工作组相关的函数:
(1)size_t get_num_groups(uint dim)–返回给定维度下工作组的数量;
(2)size_t get_group_id(uint dim)–返回给定维度下工作项的全局ID;
(3)size_t get_local_id(uint dim)–返回给定维度下工作项的局部ID;
(4)size_t get_local_size(uint dim)–返回给定维度下工作组中工作项的数量;

同样的,函数get_global_size返回的是执行同一内核的所有工作项的数量,而函数get_local_size返回的是所在工作组中工作项的数量。

发布了18 篇原创文章 · 获赞 19 · 访问量 535

猜你喜欢

转载自blog.csdn.net/INFINALGEORGE/article/details/105197873
今日推荐