gpt4 book ai didi

c++ - 理解OpenCL在OpenCV中的使用(Mat/Umat Objects)

转载 作者:搜寻专家 更新时间:2023-10-31 02:13:14 24 4
gpt4 key购买 nike

我运行了下面的代码来检查 GPU 和 CPU 使用率之间的性能差异。我正在计算 cv::cvtColor() 函数的平均时间。我进行了四个函数调用:

  1. Just_mat()(不为 Mat 对象使用 OpenCL)
  2. Just_UMat()(不为 Umat 对象使用 OpenCL)
  3. OpenCL_Mat()(将 OpenCL 用于 Mat 对象)
  4. OpenCL_UMat()(将 OpenCL 用于 UMat 对象)

CPU 和 GPU。
我没有发现 GPU 和 CPU 使用率之间存在巨大的性能差异。

int main(int argc, char* argv[])
{
loc = argv[1];
just_mat(loc);// Calling function Without OpenCL
just_umat(loc);//Calling function Without OpenCL
cv::ocl::Context context;
std::vector<cv::ocl::PlatformInfo> platforms;
cv::ocl::getPlatfomsInfo(platforms);
for (size_t i = 0; i < platforms.size(); i++)
{
//Access to Platform
const cv::ocl::PlatformInfo* platform = &platforms[i];

//Platform Name
std::cout << "Platform Name: " << platform->name().c_str() << "\n" << endl;

//Access Device within Platform
cv::ocl::Device current_device;
for (int j = 0; j < platform->deviceNumber(); j++)
{
//Access Device
platform->getDevice(current_device, j);
int deviceType = current_device.type();
cout << "Device name: " << current_device.name() << endl;
if (deviceType == 2)
cout << context.ndevices() << " CPU devices are detected." << std::endl;
if (deviceType == 4)
cout << context.ndevices() << " GPU devices are detected." << std::endl;
cout << "===============================================" << endl << endl;
switch (deviceType)
{
case (1 << 1):
cout << "CPU device\n";
if (context.create(deviceType))
opencl_mat(loc);//With OpenCL Mat
break;
case (1 << 2):
cout << "GPU device\n";
if (context.create(deviceType))
opencl_mat(loc);//With OpenCL UMat
break;
}
cin.ignore(1);
}
}
return 0;
}
int just_mat(string loc);// I check for the average time taken for cvtColor() without using OpenCl
int just_umat(string loc);// I check for the average time taken for cvtColor() without using OpenCl
int opencl_mat(string loc);//ocl::setUseOpenCL(true); and check for time difference for cvtColor function
int opencl_umat(string loc);//ocl::setUseOpenCL(true); and check for time difference for cvtColor function

上述代码的输出(以毫秒为单位)是
______________________________________________
|GPU 名称|使用 OpenCL Mat |使用 OpenCl UMat|
|__________________________________________|
|--卡里佐---|-----7.69052 ------ |-----0.247069--------|
|__________________________________________|
|---岛--- |-------7.12455----- |-----0.233345--------|
|__________________________________________|


____________________________________________
|----CPU---|带OpenCL垫|使用 OpenCl UMat |
|__________________________________________|
|---AMD---|-----6.76169 ------ |--------0.231103--------|
|__________________________________________|


__________________________________________________
|----CPU---| WithOut OpenCL垫| WithOut OpenCl UMat |
|______________________________________________|
|----AMD----|-----7.15959----- |------------0.246138------------ |
|____________________________________________|

在代码中,使用 Mat 对象始终在 CPU 上运行,而使用 UMat 对象始终在 GPU 上运行,与代码无关 ocl::setUseOpenCL(true/false);
任何人都可以解释所有输出时间变化的原因吗?

还有一个问题,我没有将任何 OpenCL 特定的 .dll 与 .exe 文件一起使用,但使用 GPU 时没有任何错误,在使用 Cmake 构建 OpenCV 时我检查了 With_OpenCL 是否构建了所有opencv_World310.dll 中的 OpenCL 所需函数?

最佳答案

In code, using Mat Object always runs on CPU & using UMat Object always runs on GPU, irrespective of the code ocl::setUseOpenCL(true/false);

很抱歉,因为我不确定这是一个问题还是一个陈述……无论哪种情况,它都是部分正确的。在 3.0 中,对于 UMat,如果您没有专用的 GPU,那么 OpenCV 只会在 CPU 上运行所有内容。如果您特别要求 Mat,您会在 CPU 上获得它。在你的情况下,你已经通过具体选择每一个来指示它们在你的每个 GPU/CPU 上运行(更多关于“选择下面的 CPU”)...阅读 this :

Few design choices support the new architecture:

  1. A unified abstraction cv::UMat that enables the same APIs to be implemented using CPU or OpenCL code, without a requirement to call OpenCL accelerated version explicitly. These functions use an OpenCL -enabled GPU if exists in the system, and automatically switch to CPU operation otherwise.

  2. The UMat abstraction enables functions to be called asynchronously. Unlike the cv::Mat of the OpenCV version 2.x, access to the underlyi ng data for the cv::UMat is performed through a method of class, and not though its data member. Such an approach enables the implementation to explicitly wait for GPU completion only when CPU code absolutely needs the result.

  3. The UMat implementation makes use of CPU-GPU shared physical memory available on Intel SoCs, including allocations that come from pointers passed into OpenCV.

我认为“使用OpenCL”也可能存在误解。当您使用 UMat 时,您就是在专门尝试使用 GPU。而且,我会在这里恳求一些无知,因此我相信 CV 正在使用一些 CL 库来自动实现......作为 2.X 的一面,我们有 cv::ocl 来专门/手动做因此,如果您在 3.X 中使用 2.X 遗留代码,请务必小心。这样做是有原因的,但并不总是直截了当的。但是,回到主题,当你说,

with OpenCL UMat

你可能是多余的。您在代码段中的 CL 代码基本上是找出安装了哪些设备,有多少设备,它们的名称是什么,以及选择使用哪个......我必须深入了解它的实例化方式,但也许当你制作 UMat 时,它会自动将 OpenCL 设置为 True 吗? ( link ) 这肯定会支持您提供的数据。您可以通过检查 ocl::setUseOpenCL 在将其设置为 false 之后的状态然后使用 UMat 来测试这个想法。

最后,我猜你的 CPU 有一个内置的 GPU。因此,它正在使用 OpenCL 运行并行处理,并且不会因往返于单独/专用 GPU 的时间而受到损失,因此您对 GPU 的感知性能会有所提高(因为从技术上讲,它不是运行它的 CPU)...只有当您正在专门使用 Mat 是仅被使用的 CPU。

你的最后一个问题,我不确定......这是我的猜测:GPU 上存在 OpenCL 架构,当你安装带有 CL 的 CV 时,你正在安装两个库和相关头文件之间的链接。我不确定您需要哪些 dll 文件才能实现这一奇迹。

关于c++ - 理解OpenCL在OpenCV中的使用(Mat/Umat Objects),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41688751/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com