OpenCL 2D工作组维度

时间:2013-12-18 10:31:37

标签: arrays graphics matrix parallel-processing opencl

我在理解OpenCL 2D工作组维度方面遇到了问题。

我想创建一个N x N矩阵,并将每一行赋予一组工作组进行计算。 例如,如果我有1000 x 1000矩阵,我希望每行有10个工作组(因此每个工作组将计算100个元素)和10000个工作组(10 * 1000)。

这是我的一段代码:

size_t global_pattern[] = {n,n,0}; //My matrix pattern
size_t group_pattern[] = {workgroups_per_row, n, 0}; //My workgroups pattern

以下几行:

err = clEnqueueNDRangeKernel(queue, kernel, 2, NULL, global_pattern, 
                             group_pattern, 0, NULL, NULL);

哪个失败了。错误代码是-54,引用#define CL_INVALID_WORK_GROUP_SIZE -54。

我对group_pattern数组的初始化是否正确?我的意思是,我假设数组的第一个元素是指x坐标,第二个元素指的是y坐标吗? 背后的数学是什么?

出于调试目的,我还尝试使用空内核运行它(只是为了确保它不是我的代码问题)。我还试图交换group_pattern数组中的第一个和第二个元素。

1 个答案:

答案 0 :(得分:4)

当你说:

size_t global_pattern[] = {n,n,0}; //My matrix pattern
size_t group_pattern[] = {workgroups_per_row, n, 0}; //My workgroups pattern

然后使用它:

err = clEnqueueNDRangeKernel(queue, kernel, 2, NULL, global_pattern, group_pattern, 0, NULL, NULL);

显然是错的。您必须传递给内核的是local_size AKA,即一组的大小。不是你想如何分割你的空间。

所以对你的情况来说就是这样:

size_t global_size[] = {n,n}; //My matrix pattern
size_t group_pattern[] = {workgroups_per_row, n}; //My workgroups pattern
size_t local_size[] = {global_size[0]/group_pattern[0], global_size[1]/group_pattern[1]}; //My workgroups pattern

err = clEnqueueNDRangeKernel(queue, kernel, 2, NULL, global_pattern, local_size, 0, NULL, NULL);

编辑:如果你有一个CL_INVALID_WORK_GROUP_SIZE,那么原因可能是:

  1. 您指定的本地大小不是全局大小的整数除数
  2. 设备不支持您定义的本地大小