我在理解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数组中的第一个和第二个元素。
答案 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,那么原因可能是: