【问题标题】:OpenCL global/local work size choiceOpenCL 全局/本地工作大小选择
【发布时间】:2016-12-22 17:30:32
【问题描述】:

我正在学习使用 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_ITEM_SIZES 限制为仅 256 x 256 x 256?我见过的大多数都至少有 8192 x 8192 x(某物)或更大。

标签: c++ windows visual-studio opencl


【解决方案1】:

本地工作总大小不能超过 CL_DEVICE_MAX_WORK_GROUP_SIZE,每个都不能超过 CL_DEVICE_MAX_WORK_ITEM_SIZES。在您的情况下,使用本地工作大小 {4, 8, 8} 是可以的。
全局工作大小中的每一个都必须是本地工作大小的倍数。当您的内核只处理一条数据时,您必须将全局工作大小设置为大于您的数组大小,并在内核中添加这样的检查

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

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

每个设备都有不同的工作大小,它们必须独立设置。让不同的设备同时运行相同的内核并非易事。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多