OpenCL内核表现很差?

时间:2014-04-09 15:14:44

标签: multithreading performance opencl

我的应用程序需要 5200ms 才能使用 330 上的 OpenCL 来计算数据集, 330ms 使用 OpenCL在CPU上使用 330ms ;虽然在使用多个线程的CPU上完成 而没有OpenCL时进行相同的数据处理需要110ms 。 OpenCL时序仅用于内核执行,即在clEnqueueNDRangeKernel之前开始,在clFinish之后结束。 我有一个Windows小工具告诉我,我只使用19%的GPU功率。即使我能够达到100%仍然需要~1000ms,这远远高于我的CPU。

enter image description here

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

__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 3X上的CPU比没有OpenCL但多的CPU慢 螺纹?

1 个答案:

答案 0 :(得分:2)

也许您可以添加一些关于如何将此内核排入队列的信息 - 可能是因为本地工作量不合适? (有疑问,只需将null作为本地工作大小 - OpenCL将选择合适的工作大小。

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

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

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

编辑:也许您还可以描述您正在执行这些计算的上下文。如果你有进一步的计算(内核)来处理这个内核的结果,也许可以将它们组合起来以提高内存/计算比率。