我的应用程序需要 5200ms 才能使用 330 上的 OpenCL 来计算数据集, 330ms 使用 OpenCL在CPU上使用 330ms ;虽然在使用多个线程的CPU上完成 而没有OpenCL时进行相同的数据处理需要110ms 。 OpenCL时序仅用于内核执行,即在clEnqueueNDRangeKernel
之前开始,在clFinish
之后结束。
我有一个Windows小工具告诉我,我只使用19%的GPU功率。即使我能够达到100%仍然需要~1000ms,这远远高于我的CPU。
工作组大小是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;
}
问题:
答案 0 :(得分:2)
也许您可以添加一些关于如何将此内核排入队列的信息 - 可能是因为本地工作量不合适? (有疑问,只需将null
作为本地工作大小 - OpenCL将选择合适的工作大小。
但即使在最好的情况下,你也不太可能在这里看到加速。你在那里进行的计算严重受内存限制。在第一个内核中,你从全局内存中读取两个元素,然后执行一个简单的减法/乘法,然后将一个元素写入全局内存(以及在第二个内核中) ,它没有太大的不同)。这里的瓶颈根本不是计算,而是数据传输。
(顺便说一句:最近,我在https://stackoverflow.com/a/22868938)中写了一些关于这一点的一般性词语。
也许统一内存,HSA,AMD Kaveri等的新发展将会在这里得到拯救,但这仍处于初期阶段。
编辑:也许您还可以描述您正在执行这些计算的上下文。如果你有进一步的计算(内核)来处理这个内核的结果,也许可以将它们组合起来以提高内存/计算比率。