首页 > 其他分享 >OpenCL切换显卡的例子

OpenCL切换显卡的例子

时间:2024-02-23 17:12:00浏览次数:23  
标签:cl int OpenCL result1 queue 切换 显卡

在一些有多个显卡,比如一个核芯显卡和一个独立显卡的系统中使用显卡加速,OpenCL默认的设备可能不是性能更好的独立显卡。这时候可以用下述方法更换显卡,代码如下。本例在VS2015和OpenCL3.0下测试通过:

const string kernel = u8R"(
    kernel void reduceSum(global int* num, global int* result)
    {
        unsigned int id = get_global_id(0); 
        result[id] = 2 * num[id];
    })";

void main()
{
    cl::Platform device = cl::Platform::getDefault();
    const int which = 0; /* 指定显卡索引 */

    cl::vector<cl::Device> devs;
    device.getDevices(CL_DEVICE_TYPE_ALL, &devs);
    string name;
    devs[which].getInfo(CL_DEVICE_NAME, &name); /* 设备名称 */

    cl::Context context(devs[which]);
    cl::CommandQueue queue(context);
    cl::Program program(context, kernel);

    try {
        program.build("-cl-std=CL2.0");
    }
    catch (...) {
        cl_int buildErr = CL_SUCCESS;
        auto buildInfo = program.getBuildInfo<CL_PROGRAM_BUILD_LOG>(&buildErr);
        for (auto &pair : buildInfo) {
            std::cerr << pair.second << std::endl << std::endl;
        }
    }
    auto kernelFunc = cl::KernelFunctor<cl::Buffer, cl::Buffer>(program, "reduceSum");
    vector<int> array1(100000, 1);
    vector<int> result1(100000, 0);

    int64 t1, t2;
    t1 = getTickCount();

    cl::Buffer inputBuffer(queue, array1.begin(), array1.end(), true);
    cl::Buffer outputBuffer(queue, result1.begin(), result1.end(), false);
    kernelFunc(cl::EnqueueArgs(queue, cl::NDRange(100000)), inputBuffer, outputBuffer);
    cl::copy(queue, outputBuffer, result1.begin(), result1.end());

    t2 = getTickCount();
    qDebug() << (t2 - t1) / getTickFrequency() * 1000 << "ms" << endl;
}

本人是自学OpenCL的,一开始由于不知道cl::Buffer的构造函数和cl::copy(...)函数有多个重载可以指定Context或CommandQueue参数导致调了几天都没有测试成功。表现就是编译正确但是运行的时候核函数输出不对。这里需要注意下,OpenCL的传输数据和输入核函数的操作基本上都是基于CommandQueue的,需要指定一个命令队列。如果不指定则函数内部会取默认命令队列操作。

上述代码中的getTickCount()是OpenCV中的函数,qDebug()是Qt的输出文本的函数,如不需要可以删掉。它们不影响OpenCL的运行。

标签:cl,int,OpenCL,result1,queue,切换,显卡
From: https://www.cnblogs.com/mengxiangdu/p/18022326

相关文章

  • 一款降压恒流内置1.2A 一切二无需切换MOS 外围超简单LED驱动芯片
    产品描述AP2915是一款可以一路灯串切换两路灯串的降压恒流驱动器,高效率、外围简单、内置功率管,适用于5-80V输入的高精度降压LED恒流驱动芯片。内置功率管输出最大功率可达12W,最大电流1.2A。AP2915一路灯亮切换两路灯亮,其中一路灯亮可以全亮,可以半亮。AP2915工作频......
  • Playwright nodejs切换页面tab
    主要使用下面的代码awaitpage.bringToFront();录制代码时,鼠标点击页面tab的代码没有录制进去,需要手动加上面一行代码完整的代码如下import{test,expect}from'@playwright/test';test('test',async({page})=>{awaitpage.goto('https://www.baidu.com/')......
  • Unity引擎2D游戏开发,场景管理和切换
    需要用到的工具资源打包、远程热更新工具Addressables工具基本操作在Window菜单下方,会有AssetManagement,选择Addressables中的Groups会弹出相关菜单,将其拖入底部工具栏会提示没有创建Addressables的相关配置,则点击CreateAddressablesSettings这时候会在Project中,多出......
  • nvm安装版本错误或无法切换版本问题
    如果无法正常使用nvmuse版本号切换版本的原因是因为部分电脑不能兼容淘宝源settings.txt文件内只需要root:D:\install\nvmpath:D:\install\nodejs第二行的install\nodejs是在他下面创建的nodejs文件夹不需要网络上面配置的node_mirror:https://npm.taobao.org/mirror......
  • 若依+vue3配置菜单后设置缓存但实际上切换页签重复请求接口
    刚接触ruoyi,配置菜单时发现一个问题,配置好了,也设置了缓存,但是切换tab页签还是会重复请求接口,配置如图:仅是举例,如上图,系统管理->角色管理列表配置,路由地址是role,缓存也勾选了,但实际上第一次打开角色管理页签第一次请求了数据,再跳转其他页面,回到角色管理页签时,又一次请求了数据,实......
  • Unity引擎2D游戏开发,切换场景与人物可互动标识总结
    切换场景可以通过新建一个持久化地场景,将所有常驻元素放置进此场景里面,然后再将进入的场景加载(Loud)在Hierarchy窗口中。如果切换了其他某一个场景,再将离开的场景停用(Unload),进入的场景加载(Loud),即可实现。创建持久化场景,移入Hierarchy将所有永恒不变,常驻的元素移入此创建的持久......
  • 组件结合树形导航点击切换中间内容
    组件页面内部自加树形导航栏<template><div>左侧</div><!--中间根据点击的导航显示,一个个封装好的组件--><div><jjcsjv-if="currentPage==='jjcsj'"></jjcsj><jxsjv-else-if="currentPage==='jxsj......
  • date字段类型的分区表切换为自动分区表
    目录适用范围问题概述问题原因解决方案适用范围oracle11g+问题概述字段date类型的range分区(按月划分分区表),历史的分区表都是人工新增分区,先要改为自动分区,减少漏加分区导致的异常。问题原因查看当前用户下存在的分区表解决方案01、查看当前用户下存在的自动分区表s......
  • UOS下切换Wayland
    UOS下切换Wayland图形化修改方法1、下载配置策略工具sudoaptinstalldde-dconfig-editor2、进入配置工具,在greeter配置中开启wayland切换配置项:dde-dconfig-editor直接改配置文件法修改/usr/share/dsg/configs/org.deepin.dde.lightdm-deepin-greeter/org.deepin.......
  • el-menu 切换子路由的时候仍保持激活状态
    使用element中的el-menu时候,我们使用路由高亮显示的时候,使用router模式和default-active当我们点击左侧菜单栏中的子路由时候,页面路由发生变化,左侧路由的选中状态就会消失,不会仍然保持选中。我们可以通过route.matched来寻找当前子路由的上机路由,route.matched含义是与给定路......