【问题标题】:OpenCL - Setting up local memory for a large datasetOpenCL - 为大型数据集设置本地内存
【发布时间】:2017-04-09 23:44:37
【问题描述】:

我有以下问题。我有 6000 * 1000 个元素需要并行处理(大部分时间)。但是,在内核的某些部分,这 6000 项必须加在一起。

当我尝试将内核输入设置为 (globalThreads = 6000 * 1000, localThreads = 6000) 时,它似乎抛出了一个错误 (CL_INVALID_WORK_GROUP_SIZE)。似乎一个工作组中的本地元素的最大数量是有限的。

我该如何解决这个问题?

【问题讨论】:

    标签: opencl


    【解决方案1】:

    您不能将本地线程设置得那么高。大多数硬件只能执行 128 到 1024 个左右的本地线程(带有 CL_DEVICE_MAX_WORK_GROUP_SIZE 的 clGetDeviceInfo 会告诉你你的设备)。您可以将本地大小保留为 NULL,运行时将为您选择一个大小,但如果您的全局大小不是设备工作组大小的倍数,这可能不会为您提供最佳性能。为了获得最佳性能,您可以尝试不同的局部大小,然后同时指定两者,但全局必须是 OpenCL 1.x 中局部大小的倍数。将全局四舍五入,然后检查内核中的工作项索引,看看它是否低于您的实际工作大小。

    【讨论】:

    • 最大计算单元:15 最大工作项维度:3 最大工作项[0]:1024 最大工作项[1]:1024 最大工作项[2]:64 最大工作组大小:1024 I好像有以下参数,是不是意味着我要按数据分成1024大小的块?
    • 在您的问题中,您正在生成 1024 个线程的多个线程,但仅使用 1000 个线程的多个线程。使局部大小为 1000。如果总工作是落沙,则每个颗粒都是局部大小。 1000. 您不能为 1.2 版分区颗粒。
    • 最大工作组大小:1024 表示您在此设备上的本地大小不能大于 1024。此外,全局大小必须是局部大小的整数倍(在 OpenCL 1.x 中)。就像我说的,如果您不想处理这些规则,可以不指定本地大小(但您可能无法获得最佳性能)。
    猜你喜欢
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多