Multithreading OpenCL内核性能很差?

Multithreading OpenCL内核性能很差?,multithreading,performance,opencl,Multithreading,Performance,Opencl,我的应用程序使用GPU上的OpenCL计算数据集需要5200ms,使用CPU上的OpenCL计算相同数据需要330ms;而在CPU上使用多线程执行相同的数据处理时,如果不使用OpenCL,则需要110毫秒。OpenCL计时仅用于内核执行,即在clenqueendrangekernel之前开始,在clFinish之后结束。 我有一个Windows小工具,它告诉我我只使用了19%的GPU功率。即使我能做到100%,它仍然需要1000毫秒,这比我的CPU要高得多 工作组大小是CL\u内核\u首选\u

我的应用程序使用GPU上的OpenCL计算数据集需要5200ms,使用CPU上的OpenCL计算相同数据需要330ms;而在CPU上使用多线程执行相同的数据处理时,如果不使用OpenCL,则需要110毫秒。OpenCL计时仅用于内核执行,即在
clenqueendrangekernel
之前开始,在
clFinish
之后结束。 我有一个Windows小工具,它告诉我我只使用了19%的GPU功率。即使我能做到100%,它仍然需要1000毫秒,这比我的CPU要高得多

工作组大小是
CL\u内核\u首选\u工作\u组大小\u倍数的倍数
,我使用所有计算单元(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;
}
问题:

  • 为什么我的GPU与OpenCL上的CPU相比性能如此差
  • 为什么OpenCL上的CPU速度比没有OpenCL但多线程的CPU慢3倍 螺纹

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

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

    (顺便说一句:最近,我写了一些关于这方面的一般性的话)

    也许统一内存、HSA、AMD Kaveri等的新发展将在这里得到拯救,但这仍处于早期阶段


    编辑:也许你也可以描述你在什么环境下进行这些计算。如果您有进一步的计算(内核)来处理此内核的结果,也许可以将它们结合起来,以提高内存/计算比率。

    Hi Marco感谢您的观点。你提到我在做一些琐碎的计算,而瓶颈就是数据传输。但我的要求只是计算这么多。那么,我的应用程序不适合OpenCL吗?@Cool_Coder这是一个非常笼统的评论:对于这样一个简单的计算,它不可能实现很好的加速。此外,您提到您还没有在计时中包含内存传输,因此情况会变得更糟。也许其他人知道一些我不知道的事情,并给你一些提示,以某种方式使在这种特定情况下实现加速成为可能,但我从未见过使用GPU执行此类任务会带来加速。我添加了另一个问题,详细说明了我如何选择本地和全球工作组的规模。你能提供你有价值的建议吗?我只对单个内核使用OpenCL,因为该内核所做的计算在我的多线程版本的应用程序中是一个瓶颈。所以我决定在GPU上执行计算,但是GPU对我手头的任务没有帮助…:()不要放弃,也许这里的其他人有个好主意。