OPENCL全球/本地工作尺寸选择

OpenCL global/local work size choice

本文关键字:选择 工作 全球 OPENCL      更新时间:2023-10-16

我正在学习使用opencl。现在,我的任务非常简单,将一个大阵列复制到另一个大数组。假设A [301] [300] [300]对B [301] [300] [300]。这只是一项测试,让我了解什么是全球工作规模和本地工作规模。我使用svm将float8矢量阵列传递到内核。

__global float8* dts,
__global float8* dts_from_file

1。我似乎必须选择全局工作大小>数组大小,在我的测试用例

size_t globalWorkSize[3] = { 128, 128, 256 };

(128*128*256*8)> 301*300*300。否则,我将获得截短的输出。我是对的还是只是对全球工作规模的定义感到困惑?仅供参考,

    CL_DEVICE_ADDRESS_BITS=64
    CL_DEVICE_MAX_WORK_GROUP_SIZE=256
    CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS=3
    CL_DEVICE_MAX_WORK_ITEM_SIZES[0,1,2]=256, 256, 256

2。是本地工作尺寸是否受cl_kernel_work_group_size = 256?

限制
size_t localWorkSize[3] = { 4,8,8 };

,就我将4更改为更大的值,将会有clenqueuendrangekernel错误cl_invalid_work_group_size,因为4*8*8 = 256?

3。多个设备的全球/本地工作大小(CPU GPU)如何,我需要为每个设备指定不同的工作大小吗?

预先感谢。

总本地工作大小不能超过cl_device_max_work_group_size,并且每个工作都不能超过cl_device_max_max_work_item_sizes。在您的情况下,使用本地工作大小{4、8、8}是可以的。
全球工作规模中的每个人都必须是本地工作规模的倍数。当您的内核过程仅处理一个数据时,您必须将全球工作尺寸设置为大于数组大小,并在内核中添加一个检查

if (get_global_id(0) < array_size_x)    {   ...   }

couse每个项目都可以处理更多数据,您必须在不同的情况下进行不同的检查。

每个设备的工作尺寸不同,必须独立设置。使不同的设备同时运行相同的内核并非易事。