【发布时间】:2020-06-13 22:19:21
【问题描述】:
来自a sample program,用于 OpenCL 编程。 我对如何计算全局和本地工作量感到困惑。 它们是根据图像大小计算的。
图像尺寸为 1920 x 1080(宽 x 高)。
我假设 global_work_size[0] 和 global_work_size[1] 是图像上的网格。
但现在 global_work_size 是 {128, 1088}。
那么 local_work_size[0] 和 local_work_size[1] 是 global_work_size 上的网格。 local_work_size 是 {128, 32}。
但总组数,num_groups = 34,不是 128 x 1088。
设备上可用的最大 workgroup_size 为 4096。
图像是如何分配到这样的全局和本地工作组大小的?
它们在以下函数中计算。
clGetKernelWorkGroupInfo(histogram_rgba_unorm8, device, CL_KERNEL_WORK_GROUP_SIZE, sizeof(size_t), &workgroup_size, NULL);
{
size_t gsize[2];
int w;
if (workgroup_size <= 256)
{
gsize[0] = 16;//workgroup_size is formed into row & col
gsize[1] = workgroup_size / 16;
}
else if (workgroup_size <= 1024)
{
gsize[0] = workgroup_size / 16;
gsize[1] = 16;
}
else
{
gsize[0] = workgroup_size / 32;
gsize[1] = 32;
}
local_work_size[0] = gsize[0];
local_work_size[1] = gsize[1];
w = (image_width + num_pixels_per_work_item - 1) / num_pixels_per_work_item;//to include all pixels, num_pixels_per_work_item is added first
global_work_size[0] = ((w + gsize[0] - 1) / gsize[0]);//col
global_work_size[1] = ((image_height + gsize[1] - 1) / gsize[1]);//row
num_groups = global_work_size[0] * global_work_size[1];
global_work_size[0] *= gsize[0];
global_work_size[1] *= gsize[1];
}
err = clEnqueueNDRangeKernel(queue, histogram_rgba_unorm8, 2, NULL, global_work_size, local_work_size, 0, NULL, NULL);
if (err)
{
printf("clEnqueueNDRangeKernel() failed for histogram_rgba_unorm8 kernel. (%d)\n", err);
return EXIT_FAILURE;
}
【问题讨论】:
标签: parallel-processing opencl