【发布时间】: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 的建议,我会找到其他方法的。