【发布时间】: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;
}
问题:
- 与 OpenCL 上的 CPU 相比,为什么我的 GPU 性能如此差。
- 为什么 OpenCL 上的 CPU 比没有 OpenCL 但多的 CPU 慢 3X 线程化?
【问题讨论】:
标签: multithreading performance opencl