调整工作全局暗淡和局部(块)暗淡的最佳方法
Best way to adjust work global dim and local (block) dim
我正在尝试 运行 gpu 上的内核。我正在寻找调整线程网格的全局和局部维度的最佳方法。在我的实验中,我了解到由 1 个线程组成的 32 个线程块比 32 个线程的 1 个块快 32 倍(在我的 nvidia GTX 980 上)。之前,我使用以下方式确定内核网格尺寸:
size_t local_ws = 32;
size_t nKernels = num_seeding_points;
local_ws = local_ws > nKernels ? nKernels : local_ws;
size_t global_ws = (nKernels + local_ws - 1) / local_ws * local_ws;
但我理解如果内核数量不大,这种方式不会完全使用我的GPU,我们将这部分更改为:
size_t local_ws = 1;
size_t nKernels = num_seeding_points;
local_ws = local_ws > nKernels ? nKernels : local_ws;
size_t global_ws = (nKernels + local_ws - 1) / local_ws * local_ws;
我的代码 运行 比以前快 20 倍。我想看看如何计算 运行ning 我的内核的最佳可能值。当然,您的经验会有很大帮助。
为了自动调整全局和局部工作大小,您应该首先查询您的内核对象 and/or 您的设备以获取以下信息:
有用的内核信息(使用 clGetKernelWorkGroupInfo()
函数):
- CL_KERNEL_WORK_GROUP_SIZE:可用于在特定设备上执行内核的最大块大小。
- CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE:获取块大小的首选倍数。这是一个性能提示,可能是优化全局和局部工作大小的最重要信息。
如果您在确定全局和局部工作大小时尚未创建内核对象,则可以查询您的设备以获取类似信息(使用 clGetDeviceInfo()
函数):
- CL_DEVICE_MAX_WORK_ITEM_SIZES:block每个维度可以指定的最大线程数
- CL_DEVICE_MAX_WORK_GROUP_SIZE: 一个块中的最大线程数。
从您要处理的工作的实际大小开始(即num_seeding_points
),并使用上述函数提供的信息,您可以为您使用的任何 OpenCL 设备优化全局和局部工作大小正在使用。最重要的是,始终尝试使本地工作规模成为 CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE.
的倍数
请注意,对于较小的全局大小(低于 128 或 256),这些优化不会带来太大好处。
我为 cf4ocl library called ccl_kernel_suggest_worksizes()
that suggests optimum global and local work sizes given the size of the work you want to process, a device, and optionally, a kernel object. Check its source code here 编写了一个函数,也许它提供了一些额外的提示。
我正在尝试 运行 gpu 上的内核。我正在寻找调整线程网格的全局和局部维度的最佳方法。在我的实验中,我了解到由 1 个线程组成的 32 个线程块比 32 个线程的 1 个块快 32 倍(在我的 nvidia GTX 980 上)。之前,我使用以下方式确定内核网格尺寸:
size_t local_ws = 32;
size_t nKernels = num_seeding_points;
local_ws = local_ws > nKernels ? nKernels : local_ws;
size_t global_ws = (nKernels + local_ws - 1) / local_ws * local_ws;
但我理解如果内核数量不大,这种方式不会完全使用我的GPU,我们将这部分更改为:
size_t local_ws = 1;
size_t nKernels = num_seeding_points;
local_ws = local_ws > nKernels ? nKernels : local_ws;
size_t global_ws = (nKernels + local_ws - 1) / local_ws * local_ws;
我的代码 运行 比以前快 20 倍。我想看看如何计算 运行ning 我的内核的最佳可能值。当然,您的经验会有很大帮助。
为了自动调整全局和局部工作大小,您应该首先查询您的内核对象 and/or 您的设备以获取以下信息:
有用的内核信息(使用 clGetKernelWorkGroupInfo()
函数):
- CL_KERNEL_WORK_GROUP_SIZE:可用于在特定设备上执行内核的最大块大小。
- CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE:获取块大小的首选倍数。这是一个性能提示,可能是优化全局和局部工作大小的最重要信息。
如果您在确定全局和局部工作大小时尚未创建内核对象,则可以查询您的设备以获取类似信息(使用 clGetDeviceInfo()
函数):
- CL_DEVICE_MAX_WORK_ITEM_SIZES:block每个维度可以指定的最大线程数
- CL_DEVICE_MAX_WORK_GROUP_SIZE: 一个块中的最大线程数。
从您要处理的工作的实际大小开始(即num_seeding_points
),并使用上述函数提供的信息,您可以为您使用的任何 OpenCL 设备优化全局和局部工作大小正在使用。最重要的是,始终尝试使本地工作规模成为 CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE.
请注意,对于较小的全局大小(低于 128 或 256),这些优化不会带来太大好处。
我为 cf4ocl library called ccl_kernel_suggest_worksizes()
that suggests optimum global and local work sizes given the size of the work you want to process, a device, and optionally, a kernel object. Check its source code here 编写了一个函数,也许它提供了一些额外的提示。