了解 OpenCL 在 OpenCV 中的用法(Mat/ Umat 对象)

2024-01-03

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

  1. Just_mat()(不使用 OpenCLMat目的)
  2. Just_UMat()(不使用 OpenCLUmat目的)
  3. OpenCL_Mat()(使用 OpenCL 进行Mat object)
  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 Mat |使用 OpenCl UMat |
|________________________________________|
|---AMD---|--------6.76169 ------ |--------0.231103--------|
|________________________________________|


________________________________________________
|----CPU---|没有 OpenCL Mat |没有OpenCl UMat |
|________________________________________________________|
|----AMD---|--------7.15959------ |------------0.246138------------ |
|________________________________________________________|

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

还有一个问题,我没有使用任何 OpenCL 特定的 .dll 和 .exe 文件,但使用 GPU 时没有任何错误,在使用 Cmake 构建 OpenCV 时我检查过With_OpenCL这是否构建了所有 OpenCL 所需的功能opencv_World310.dll ?


在代码中,使用 Mat 对象始终在 CPU 上运行,使用 UMat 对象始终在 GPU 上运行,无论代码如何 ocl::setUseOpenCL(true/false);

抱歉,因为我不确定这是一个问题还是一个陈述……无论哪种情况,这都是部分正确的。在 3.0 中,对于UMat,如果您没有专用 GPU,那么 OpenCV 只会在 CPU 上运行所有内容。如果您特别要求Mat你把它放在CPU上。在您的情况下,您通过专门选择每个 GPU/CPU 来指示两者在每个 GPU/CPU 上运行(更多关于“选择下面的 CPU”的信息)...阅读this https://software.intel.com/sites/default/files/managed/2f/19/inde_opencv_3.0_arch_guide.pdf:

很少有设计选择支持新架构:

  1. 统一抽象 cv::UMat,可以使用 CPU 或 OpenCL 代码实现相同的 API,无需调用 OpenCL 明确加速版本。这些函数使用 OpenCL -启用GPU(如果系统中存在),并自动切换到CPU 否则进行操作。

  2. UMat 抽象允许异步调用函数。 与OpenCV 2.x版本的cv::Mat不同,访问underlyi cv::UMat 的 ng 数据是通过类的方法执行的,而不是通过其数据成员。这种方法使得 仅当 CPU 代码绝对需要结果时才显式等待 GPU 完成。

  3. UMat 实现利用 Intel SoC 上可用的 CPU-GPU 共享物理内存,包括来自传递到 OpenCV 的指针的分配。

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

与 OpenCL UMat

你可能是多余的。代码片段中的 CL 代码基本上是找出安装了哪些设备、有多少个、它们的名称是什么,以及选择使用哪个...我必须深入研究它的实例化方式,但也许当你做到的时候UMat它会自动将 OpenCL 设置为 True? (link http://answers.opencv.org/question/123097/how-to-stop-using-gpu-in-opencv-32/)这肯定会支持你提供的数据。您可以通过检查 ocl::setUseOpenCL 将其设置为 false 后的状态来测试这个想法,然后使用UMat.

最后,我猜测您的 CPU 具有内置 GPU。因此,它使用 OpenCL 运行并行处理,而不需要花费时间来往返于单独/专用 GPU 上,因此您感知到的性能相对于 GPU 而言有所提高(因为从技术上讲,它不是运行它的 CPU)……只有当您正在专门使用Mat仅使用CPU。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解 OpenCL 在 OpenCV 中的用法(Mat/ Umat 对象) 的相关文章

  • 在两个 .cpp 文件之间定义全局变量 [重复]

    这个问题在这里已经有答案了 如何在 A cpp 和 B cpp 之间共享 全球化 bool 变量 其中它们都不包含其他 h 文件 他们有其他联合头文件 但彼此没有 我可以在这些共享标头中定义全局变量吗 Thanks 我可以在这些共享标头中定
  • 提高光线追踪命中功能的性能

    我有一个简单的 python 光线追踪器 渲染 200x200 的图像需要 4 分钟 这对于我的口味来说绝对是太多了 我想改善这种情况 几点 我为每个像素发射多条光线 以提供抗锯齿功能 每个像素总共发射 16 条光线 200x200x16
  • .NET Windows 服务中调用 C# 的 wait 的 I/O 回调是否可以不阻塞?

    我知道在 ASP NET 中 当使用 wait 时工作线程会返回到池中 而 I O 发生在后台 这对于可扩展性非常有用 我的 Windows 服务是一个套接字服务器 它使用 Begin End 样式的异步套接字 I O 混合我的魔法 我知道
  • 从 .Net 将简单数据插入 Excel 文件的最简单方法

    我有一个 Excel 文件 大约有 10 列和 1 20 行 我需要插入 1 20 行包含各种数据元素 我想知道是否有一种方法可以将一些标签放入 Excel 文件中 以便可以找到并替换它们 将列标记为 名称 的东西 这样我就可以在代码中说
  • C++ - 模板专业化和部分专业化

    我一直在互联网和 stackoverflow 上寻找具体的答案 但我似乎找不到 我必须创建一个通用类 然后实现特定的功能 我的具体说明是 您需要使用模板表达式参数以及模板类专业化和部分专业化 我有一个模板类 template
  • 为什么 LinkedList 通常比 List 慢?

    我开始在我的一些 C 算法中使用一些 LinkedList 而不是列表 希望能够加快速度 然而 我注意到他们只是感觉更慢 像任何优秀的开发人员一样 我认为我应该尽职调查并验证我的感受 所以我决定对一些简单的循环进行基准测试 我认为用一些随机
  • 使用 QSet 作为 Qt 地图容器中的键

    我需要一个映射 其中键是唯一的 并且每个键都是一组或自定义 POD 结构 其中包含 3 个数据项 这些值只是指向对象实例的指针 从阅读Qt 的 QMap 与 QHash 的文档 http qt project org doc qt 4 8
  • 将语句插入 SQL Server 数据库

    最近几天我试图找到这个错误 但没有成功 我正在尝试在数据库中插入一个新行 一切都很顺利 没有错误 也没有程序崩溃 My INSERT声明如下 INSERT INTO Polozaj Znesek Uporabnik Cas Kupec Po
  • 未定义异常变量时通过引用捕获

    捕获异常时 标准指导是按值抛出 按引用捕获 据我了解 这有两个原因 如果由于内存不足异常而引发异常 我们将不会调用可能终止程序的复制构造函数 如果异常是继承层次结构的一部分 我们可能会对异常进行对象切片 如果我们有一个场景 我们没有在 ca
  • Windows 程序如何临时更改其时区?

    我写了一个函数来返回time t与给定日期的午夜相对应的值 当给定日期没有午夜时 它返回最早可用的时间 例如 当埃及进入夏令时时 这种情况就可能发生 今年 时间更改于 4 月 29 日晚上午夜生效 因此时钟直接从 23 59 转到 01 0
  • 在非指针变量和类成员上放置 new

    考虑以下示例 include
  • IBM Watson 对话服务错误:无法从“方法组”转换为“conversation.onMessage”

    我正在尝试运行 IBM Watson会话服务团结和下面是代码片段 https github com watson developer cloud unity sdk conversation private Conversation m C
  • 从存储过程返回 int 值并在 ASP.NET 代码中检查它以验证登录表单

    当我多次尝试但没有得到有效结果时 使此代码运行的真实顺序是什么 SQL存储过程的代码 set ANSI NULLS ON set QUOTED IDENTIFIER ON GO ALTER PROC dbo login proc usern
  • 为什么 GCC 6.3 在没有显式 C++11 支持的情况下编译此 Braced-Init-List 代码?

    我有一个问题大括号括起来的列表的不同含义 https stackoverflow com q 37682392 2642059 我知道C 03不支持C 11initializer list 然而 即使没有 std c 11编译器标志 gcc
  • 如果数组为空,LINQ 返回 null

    public class Stuff public int x other stuff 我有一个IEnumerable
  • fscanf 和 EOF 中的否定扫描集

    我的文件中有一个以逗号分隔的字符串列表 姓名 1 姓名 2 姓名 3 我想跳过所有逗号来阅读这些名字 我写了以下循环 while true if fscanf file my string 1 break 然而 它总是比预期多执行一次 给定
  • 向每个收件人发送一封包含不同内容的电子邮件(使用抄送字段)

    在你因为这个问题 毫无意义 和 不可能 而驳回之前 请听我说完 问题 我们在使用我们的系统发送的每封电子邮件中实施跟踪像素 即具有唯一 URL 的可下载 GIF 文件 这有助于我们跟踪电子邮件的打开情况 问题是 当我们抄送一些收件人时 跟踪
  • 为什么从绑定返回的对象会忽略额外的参数?

    假设我有一个带有两个参数的函数 void f int x int y 我想绑定其中之一 我可以用std bind如下 auto partiallyBoundF std bind f 10 1 partiallyBoundF仅需要一个参数 但
  • 编译器什么时候内联函数?

    在 C 中 函数仅在显式声明时才内联inline 或在头文件中定义 或者编译器是否允许内联函数 因为他们认为合适 The inline关键字实际上只是告诉链接器 或告诉编译器告诉链接器 同一函数的多个相同定义不是错误 如果您想在标头中定义函
  • 如何设置 Swashbuckle 与 Microsoft.AspNetCore.Mvc.Versioning

    我们有asp net core webapi 我们添加了Microsoft AspNetCore Mvc Versioning and Swashbuckle拥有招摇的用户界面 我们将控制器指定为 ApiVersion 1 0 Route

随机推荐

  • 错误 itms-90122 - 可执行文件大小无效

    我只是在将应用程序上传到应用程序商店时遇到一些问题 问题是armv7的60MB文件大小限制 见截图 几乎没有嵌入图像或类似的东西 应用程序文件只有 0 5MB 大 但我确信由于下次更新它会很快增加 有没有可能减少应用程序的大小 或者也许更改
  • 当只处理单个图像时是否需要 imagedestroy() ?

    我正在使用 PHP 来使用 GD 扩展处理一些图像 代码结构相当复杂 图像被分配在代码的 深处 并且有许多 IF 可以简单地退出 该脚本仅处理单个图像 一旦将其写入文件 它就会退出 我想我可以使用 try catch 代替 但我有兴趣知道是
  • 在 python 中多重处理 shell 脚本

    我的要求是与多处理并行运行 shell 函数或脚本 目前 我使用以下不使用多重处理的脚本来完成它 此外 当我并行启动 10 个作业时 其中一项作业可能会提前完成 并且必须等待其他 9 个作业完成 我想借助 python 中的多处理来消除这个
  • filter_var 和filter_input 之间的区别

    为什么这不起作用 if data email filter var INPUT POST email FILTER SANITIZE EMAIL errors email Invalid Email 这是有效的 if data email
  • 与 Ace Editor 分开的托管模式文件

    我想将 ACE Editor 与桌面应用程序捆绑在一起 并将其呈现在 WebView 中 艾斯正在奔跑file 协议 有没有办法将模式文件与ace js 例如ace js将位于应用程序包内 Application MyApp app 但模式
  • Visual Studio:在调试时编辑 XAML 文件

    我有一个在调试模式下运行的 WPF 应用程序 我想在应用程序仍在运行时更改 XAML I m not要求编辑并继续 我不介意我必须重新启动应用程序才能使更改生效 我只想能够更改 XAML 文件当应用程序仍在运行时 而不必 1 记住我想要在
  • 电话间隙。无法启动地理定位服务

    PhoneGap 版本 2 0 0 Android API 级别 16 4 0 3 版本 提示错误的代码示例 navigator geolocation getCurrentPosition onSuccess onError enable
  • VBA删除带有数字的整行(For循环的变量)

    我正在努力解决一个非常基本的问题 Public Sub Optionfilter Dim c As Range Dim StrikeD As Date Dim RefD As Date Dim StrikeP As Integer Dim
  • Python:如何保存简单的设置/配置文件?

    我不在乎是不是JSON pickle YAML 管他呢 我见过的所有其他实现都不向前兼容 所以如果我有一个配置文件 在代码中添加一个新密钥 然后加载该配置文件 它就会崩溃 有什么简单的方法可以做到这一点吗 python中的配置文件 根据所需
  • 如何使用 Vertx 路由器和 Quarkus 将所有未找到的路由重定向到 index.html?

    我有一个 Quarkus 应用程序 它全部打包了一个 Angular SPA 捆绑在 JAR 中 Quarkus 提供后端 API 路由供前端使用 Angular 应用程序构建被复制到META INF resources构建 Quarkus
  • 您可以从 JETTY 取消部署应用程序吗?

    我似乎无法找到在 JETTY 运行时取消部署或关闭应用程序的方法 是杀死 JETTY 和所有其他正在运行的应用程序的唯一方法吗 您可以通过几种方式做到这一点 如果您有deploy模块已启用 只需移动 appname war or appna
  • 在 Python 的 format() 函数中使用变量

    是否可以在 Python 的 format 函数的格式说明符中使用变量 我有以下代码 我需要 VAR 等于 field size def pretty printer numbers str list str num lstrip 0 fo
  • constexpr 函数作为数组大小

    我试图找出为什么我的代码可以编译 但它不应该编译 include
  • 如何为蛇形式的游戏创建从 1 级到 1000 级的可滚动关卡地图

    这是我想要的用户界面在此输入图像描述 https i stack imgur com sUtG0 png None
  • 如何删除 git 提交历史记录中的敏感数据(API_KEY)?

    我完成了一个需要我使用 api key 的 android 项目 我已在 build gradle 文件中添加了 api 密钥 如下所示 buildTypes each it buildConfigField String MDB API
  • css div动态向上增长

    基本上 我正在制作一个游戏 在我的游戏中 我不希望玩家能够互相交谈 你有一个人物 当你说话时 你的文字会出现在你的角色上方的说话气泡 div 中 我的困境是 当我在气泡中输入太多文本时 气泡会扩展到字符上 所以我希望泡沫向上生长 我一直在尝
  • 自定义 .htaccess 重写规则的意外行为

    所以我一直在研究一些没有按预期工作的重写规则 这些是我尝试重写的一些示例请求 gt index php page Home Home gt index php page Home Teaching Foo gt index php page
  • Gcc 检查给定的类是否有operator+

    我创建了下面的代码来测试两个类是否存在运算符 重载 template
  • Highcharts 不显示包含大量数据点的系列

    我有一个图表 我想根据用户的日期范围显示它 该特定图表每 15 分钟就有一个数据点 因此 如果用户选择较大的日期范围 每个系列可能会有很多数据点 这里有几个例子 系列中有 623 个数据点 http jsfiddle net uTXfQ 系
  • 了解 OpenCL 在 OpenCV 中的用法(Mat/ Umat 对象)

    我运行下面的代码来检查 GPU 和 CPU 使用率之间的性能差异 我正在计算平均时间cv cvtColor 功能 我进行了四个函数调用 Just mat 不使用 OpenCLMat目的 Just UMat 不使用 OpenCLUmat目的