【问题标题】:OpenCL kernel performing very poor?OpenCL 内核性能很差?
【发布时间】:2014-04-10 00:04:22
【问题描述】:

我的应用程序使用 GPU 上的 OpenCL 计算数据集需要 5200 毫秒,使用 CPU 上的 OpenCL 计算相同数据需要 330 毫秒 ;而在 CPU 上使用多个线程在没有 OpenCL 的情况下完成相同的数据处理需要 110 毫秒。 OpenCL 计时仅用于内核执行,即在clEnqueueNDRangeKernel 之前开始并在clFinish 之后结束。 我有一个 Windows 小工具,它告诉我我只使用了 19% 的 GPU 功率。即使我可以达到 100% 仍然需要大约 1000 毫秒,这比我的 CPU 高得多。

工作组大小是CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE 的倍数,我正在使用所有计算单元(6 个用于 GPU,4 个用于 CPU)。这是我的内核:

__kernel void reduceURatios(__global myreal *coef, __global myreal *row, myreal ratio)
{
    size_t gid = get_global_id(0);

    myreal pCoef = coef[gid];
    myreal pRow = row[gid];

    pCoef = pCoef - (pRow * ratio);
    coef[gid] = pCoef;
}

另一个内核的性能也很差:

__kernel void calcURatios(__global myreal *ratios, __global myreal *rhs, myreal c, myreal r)
{
    size_t gid = get_global_id(0);

    myreal pRatios = ratios[gid];
    myreal pRHS = rhs[gid];

    pRatios = pRatios / c;
    ratios[gid] = pRatios;

    //pRatios = pRatios * r;
    pRHS = pRHS - (pRatios * r);
    rhs[gid] = pRHS;
}

问题:

  1. 与 OpenCL 上的 CPU 相比,为什么我的 GPU 性能如此差。
  2. 为什么 OpenCL 上的 CPU 比没有 OpenCL 但多的 CPU 慢 3X 线程化?

【问题讨论】:

    标签: multithreading performance opencl


    【解决方案1】:

    也许您可以添加一些有关如何将该内核排入队列的信息 - 可能使用不适当的本地工作大小? (如有疑问,只需将 null 作为本地工作大小传递 - OpenCL 会选择一个合适的)。

    但即使在最好的情况下,您也不太可能在这里看到加速。您在那里进行的计算受到严重的内存限制。在第一个内核中,您从全局内存读取两个元素,然后执行简单的减法/乘法,然后将一个元素写入全局内存(在第二个内核中) ,差别不大)。这里的瓶颈根本不是计算,而是数据传输。

    (顺便说一句:最近,我在https://stackoverflow.com/a/22868938 中写了一些关于此的一般性的话)。

    也许Unified Memory、HSA、AMD Kaveri等的新发展会来救场,但这还处于早期阶段。

    编辑:也许您还可以描述您在哪个 context 中执行这些计算。如果你有更多的计算(内核)可以处理这个内核的结果,也许可以将它们组合起来以提高内存/计算比。

    【讨论】:

    • 嗨,Marco 感谢您提出意见。你提到我正在做微不足道的计算,而瓶颈是数据传输。但我的要求只有这么多计算。那么我的应用程序不适合 OpenCL 呢?
    • @Cool_Coder 这是一个非常笼统的评论:对于如此简单的计算,不太可能实现良好的加速。此外,您提到您还没有在计时中包含内存传输 - 所以它会变得更糟。也许其他人知道一些我知道的事情,并给你一些提示,以某种方式在这种特殊情况下实现加速,但我从未见过使用 GPU 进行这样的加速任务。
    • 我添加了另一个问题,详细说明了我如何选择本地和全局工作组大小。能否请您提出宝贵的建议? stackoverflow.com/questions/22968369/…
    • 我仅将 OpenCL 用于单个内核,因为该内核完成的计算以前是我的多线程版本应用程序的瓶颈。所以我决定在 GPU 上执行计算,但事实证明 GPU 对我手头的任务没有帮助......:(((
    • 不要放弃。也许这里的其他人有一个绝妙的主意。
    猜你喜欢
    • 2014-05-22
    • 2017-10-03
    • 2014-06-22
    • 2020-02-19
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 2022-11-22
    相关资源
    最近更新 更多