【问题标题】:GPU with OpenCL is slower than CPU. Why?带有 OpenCL 的 GPU 比 CPU 慢。为什么?
【发布时间】:2020-11-19 07:26:21
【问题描述】:

环境:

  • 英特尔 i7-9750H
  • 英特尔 UHD 显卡 630
  • Nvidia GTX1050(笔记本电脑)
  • Visual Studio 2019 / C++
  • OpenCV 4.4
  • OpenCL 3.0(英特尔)/1.2(英伟达)

我正在尝试使用 OpenCL 来加速我的代码。但结果显示 CPU 比 GPU 快。 我怎样才能加快我的代码速度?

void GetHoughLines(cv::Mat dst) {
    cv::ocl::setUseOpenCL(true);

    int img_w = dst.size().width; // 5000
    int img_h = dst.size().height; // 4000

    cv::UMat tmp_dst = dst.getUMat(cv::ACCESS_READ);
    cv::UMat tmp_mat = cv::UMat(dst.size(), CV_8UC1, cv::Scalar(0));

    for (size_t i = 0; i < 1000; i++)
    {
        tmp_mat = tmp_mat.mul(tmp_dst);
    }
}

仅使用 CPU 时大约需要 3000 毫秒。 当我使用 Intel UHD Graphics 630 时,需要 3500 毫秒。 而且我也试过GTX1050,不过用了3000ms左右。

请给我一些想法来加快速度。我应该让它至少1000毫秒。 我应该使用 AMP 还是 OpenMP?但据我所知,它们只能计算简单的运算,不适用于 OpenCV 函数。

【问题讨论】:

  • 称显卡真是大手笔,原来如此。众所周知,英特尔的嵌入式 GPU 速度很慢,因为它是您可以放在芯片上以在屏幕上显示实际图形的最低要求,仅此而已。您将在离散 GPU 上获得更好的结果。中端 AMD 或 NVidia 卡的性能可能会好很多。
  • @tadman 谢谢你的回复。正如您评论的那样,我尝试使用 Nvidia GPU。但它仍然很慢。您还有其他加快速度的想法吗?
  • 获得更快的 GPU。如果您只需要快速运行几次,请考虑使用 GPU 按需服务,例如云托管选项。查看您可以进行的任何算法改进。使用分析器找出是否可以进行任何优化。看看你是否真的需要 1000 次迭代。等等。
  • 我不确切知道 open cv 是如何实现 open CL 的,但我想你的矩阵必须在每次循环迭代时从 gpu 复制到 gpu,这将是低效的,手动编写的 open CL 很可能更快
  • 感谢@tadman、AlanBirtles、pmdj 的建议,我会找到其他方法的。

标签: c++ opencv opencl


【解决方案1】:

基本上,您的代码很慢,因为 OpenCV 使用 OpenCL 的方式效率低下。 它与底层硬件无关。

为了使 OpenCL 代码(或任何与 GPU 相关的代码)高效,主机端代码正确利用 GPU 至关重要。举几个原则:

  • 通过异步将许多计算(内核)加入队列使 GPU 饱和。
  • 避免不必要的同步。
  • 避免在主机 CPU 和 GPU 设备之间进行不必要的内存复制。

即使您编写了最优化的 GPU 内核,但未能遵守这些基本原则,您也不太可能获得任何性能提升。

OpenCV 代码库是遵守这些原则的一个很好的例子。

对于您的示例,如果您重写代码以避免内存复制并显式使用设备内存,您可能会看到合理的性能:

auto frame1 = cv::UMat(size, format, cv::USAGE_ALLOCATE_DEVICE_MEMORY);
auto frame2 = cv::UMat(size, format, cv::USAGE_ALLOCATE_DEVICE_MEMORY);
auto frame3 = cv::UMat(size, format, cv::USAGE_ALLOCATE_DEVICE_MEMORY);

for (size_t i = 0; i < 10; i++)
{
    cv::multiply(frame1, frame2, frame3);
}

但无论如何,我建议您学习在没有 OpenCV 的情况下使用 OpenCL API。

【讨论】:

  • 这正是我发现的。 OpenCV 的架构不利于现代异步工作,难怪他们内部真的赢不了多少。
  • 非常感谢。我应该学习更多关于编程的知识。
猜你喜欢
  • 1970-01-01
  • 2012-08-17
  • 2021-02-09
  • 2022-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-01
相关资源
最近更新 更多