# GPU使用指南 ***Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.*** --- GPU(图形处理器) 是设备里的一块专用芯片,专门负责"画图"和"计算图像"。如果把手机比作一台电脑: CPU 负责"思考"——处理逻辑、运行程序,GPU 负责"画画"——把所有内容渲染成屏幕上显示的图像 没有 GPU,设备的屏幕就无法显示界面,游戏、视频、动画都无法运行。GPU 的性能直接影响设备的流畅度和功耗。 | **用途** | **说明** | | --- | --- | | **系统界面** | 开机动画、桌面、应用切换、下拉菜单等所有界面渲染 | | **游戏娱乐** | 3D 游戏、动画效果、AR 应用等图形渲染 | | **视频播放** | 视频色彩处理、画面增强、HDR 效果 | | **相机拍照** | 取景画面、滤镜效果、图像美化 | | **通用计算** | 协助 CPU 做并行计算,如人脸识别、AI 应用加速 | # GPU配置

类别

M1说 明

L1说明
应用处理器 八核64位ARM Kryo™ 260处理器:
4 × A73 @ 2.0 GHz, 1 MB二级缓存
4 × A53 @ 1.8 GHz,512 KB二级缓存
ARM 四核 64 位处理器:
4 x A53 @ 2.0 GHz,512 KB 二级缓存
GPU 64位Adreno™ 610 @ 1050 MHZ 64 位 Adreno™ 702 @ 845 MHz
显示接口 1 × Micro HDMI接口,HDMI 1.4 (帧率\),编码:1080P(H.264/H.265)@ 60 fps\),解码:1080P (H.264/H.265/VP9) @ 60 fps\*) 1 × Micro HDMI接口,HDMI 1.4 (帧率\),编码:1080P(H.264/H.265)@ 60 fps\),解码:1080P (H.264/H.265/VP9) @ 60 fps\*)
1 × FPC座,基于MIPI标准的FHD+(1080 × 2520)@ 60 fps\* 1 × FPC座,基于MIPI标准的 HD+(1680 × 720)@ 60 fps\*
# GPU使用 ## **Android** 播放4K高清视频 ```{image} images/image_PdV8bsFMwopQdNxOf6ic4cUXnEh.webp :width: 1920px :height: 1080px :align: center ``` ## **Debian OpenCV GPU 加速开发与验证** ### 准备工作 #### 开发环境 - PC:Windows - 开发板:Quectel Pi M1 - 系统:Debian GNU/Linux 13 #### 开发工具 - **VS Code**:用于编写和修改 Benchmark 源码。 - **ADB(Android Debug Bridge)**:用于连接开发板、执行 Linux 命令、编译及运行程序。 注:除源码编写外,本文涉及的所有 Linux 命令(软件安装、环境验证、程序编译、程序运行等)均在 **ADB Shell** 中执行。 #### 连接开发板 在PC端ADB文件夹下的地址输入栏输入CMD打开命令行,执行: ```plaintext adb devices ``` 确认开发板已连接,例如: ```plaintext List of devices attached xxxxxxxx device ``` 进入开发板: ```plaintext adb shell ``` ### 测试目的 安装 Debian 官方 OpenCV 4.10.0,验证 Debian是否能够通过镜像自带的Qualcomm OpenCL Runtime调用 Adreno GPU,实现OpenCL GPU加速。 ### 测试环境 |

项目
|

内容
| | --- | --- | | 开发板 | Quectel Pi M1(QSM200U) | | 系统 | Debian GNU/Linux 13 | | Debian OpenCV | 4.10.0 | | GPU | Qualcomm Adreno 610 | | OpenCL Runtime | Qualcomm OpenCL Runtime | ### 安装Debian官方软件源OpenCV ```plaintext apt update apt install g++ pkg-config libopencv-dev python3-opencv ``` 安装完成后验证: ```plaintext opencv_version pkg-config --modversion opencv4 dpkg -l | grep opencv ``` 验证结果: - opencv_version:4.10.0 - pkg-config:4.10.0 - dpkg:Debian OpenCV 4.10.0 ### 验证 OpenCL Runtime 确认系统 OpenCL 库: ```plaintext find /usr/lib -name "libOpenCL*" ``` 确认存在: ```plaintext libOpenCL.so libOpenCL.so.1 libOpenCL.so.1.2 libOpenCL_adreno.so ``` ### 编写 Benchmark 程序 在 VS Code 中创建opencv_gpu_benchmark.cpp文件 ```plaintext #include #include #include #include static double run_cpu(const cv::Mat &src, int loops, cv::Mat &result) { cv::ocl::setUseOpenCL(false); cv::Mat current = src.clone(); cv::Mat next; for (int i = 0; i < 5; ++i) { cv::multiply(current, 1.000001, next); current = next; } current = src.clone(); const int64 start = cv::getTickCount(); for (int i = 0; i < loops; ++i) { cv::multiply(current, 1.000001, next); current = next; } const int64 end = cv::getTickCount(); result = current.clone(); return (end - start) * 1000.0 / cv::getTickFrequency(); } static double run_gpu(const cv::Mat &src, int loops, cv::Mat &result) { cv::ocl::setUseOpenCL(true); if (!cv::ocl::useOpenCL()) { std::cerr << "OpenCL could not be enabled." << std::endl; return -1.0; } cv::UMat current; cv::UMat next; src.copyTo(current); for (int i = 0; i < 5; ++i) { cv::multiply(current, 1.000001, next); current = next; } src.copyTo(current); cv::ocl::finish(); const int64 start = cv::getTickCount(); for (int i = 0; i < loops; ++i) { cv::multiply(current, 1.000001, next); current = next; } cv::ocl::finish(); const int64 end = cv::getTickCount(); current.copyTo(result); return (end - start) * 1000.0 / cv::getTickFrequency(); } int main(int argc, char **argv) { if (argc != 2) { std::cout << "Usage: " << argv[0] << " cpu|gpu|both" << std::endl; return 1; } const std::string mode = argv[1]; const int loops = 500; cv::Mat src(2160, 3840, CV_32FC1); cv::randu(src, 0.0f, 1.0f); std::cout << "OpenCV version: " << CV_VERSION << std::endl; std::cout << "haveOpenCL: " << cv::ocl::haveOpenCL() << std::endl; std::cout << "Image size: 3840x2160, CV_32FC1" << std::endl; std::cout << "Loops: " << loops << std::endl; if (mode == "cpu") { cv::Mat cpu_result; const double cpu_ms = run_cpu(src, loops, cpu_result); std::cout << "Mode: CPU" << std::endl; std::cout << "CPU total time: " << cpu_ms << " ms" << std::endl; std::cout << "CPU average time: " << cpu_ms / loops << " ms" << std::endl; } else if (mode == "gpu") { cv::ocl::Context context; if (!context.create(cv::ocl::Device::TYPE_GPU)) { std::cerr << "Failed to create GPU context." << std::endl; return 1; } cv::ocl::Device device = context.device(0); std::cout << "Mode: GPU" << std::endl; std::cout << "Device name: " << device.name() << std::endl; std::cout << "Vendor: " << device.vendorName() << std::endl; std::cout << "OpenCL version: " << device.version() << std::endl; cv::Mat gpu_result; const double gpu_ms = run_gpu(src, loops, gpu_result); if (gpu_ms < 0.0) { return 1; } std::cout << "GPU total time: " << gpu_ms << " ms" << std::endl; std::cout << "GPU average time: " << gpu_ms / loops << " ms" << std::endl; } else if (mode == "both") { cv::Mat cpu_result; cv::Mat gpu_result; const double cpu_ms = run_cpu(src, loops, cpu_result); const double gpu_ms = run_gpu(src, loops, gpu_result); if (gpu_ms < 0.0) { return 1; } const double max_difference = cv::norm(cpu_result, gpu_result, cv::NORM_INF); std::cout << "Mode: BOTH" << std::endl; std::cout << "CPU average time: " << cpu_ms / loops << " ms" << std::endl; std::cout << "GPU average time: " << gpu_ms / loops << " ms" << std::endl; std::cout << "Speedup: " << cpu_ms / gpu_ms << "x" << std::endl; std::cout << "Maximum result difference: " << max_difference << std::endl; if (max_difference < 0.01) { std::cout << "Result check: PASS" << std::endl; } else { std::cout << "Result check: FAIL" << std::endl; return 1; } } else { std::cerr << "Invalid mode. Use cpu, gpu or both." << std::endl; return 1; } return 0; } ``` 程序主要完成以下功能: - 创建测试图像 - CPU 执行 **cv::multiply()** - GPU(UMat)执行 **cv::multiply()** - 分别统计 CPU、GPU 平均耗时 - 校验 CPU 与 GPU 运算结果 - 输出 GPU 加速比(Speedup) ### 编译 Benchmark 把vscode中的opencv_gpu_benchmark.cpp文件保存到adb文件夹下然后推送到板子: ```bash adb push opencv_gpu_benchmark.cpp /data/local/tmp/ ``` 进入源码目录: ```bash cd /data/local/tmp ``` 编译: ```bash g++ -O2 opencv_gpu_benchmark.cpp -o opencv_gpu_benchmark $(pkg-config --cflags --libs opencv4) ``` 生成可执行文件: ```plaintext opencv_gpu_benchmark ``` ### 运行 Benchmark ```plaintext export LD_LIBRARY_PATH=/opt/qcom/lib:$LD_LIBRARY_PATH ``` ```plaintext ./opencv_gpu_benchmark both ``` 运行结果: ```plaintext OpenCV version: 4.10.0 haveOpenCL: 1 CPU average time: 28.9083 ms GPU average time: 0.0474746 ms Speedup: 608.92x Maximum result difference: 0.000506639 Result check: PASS ``` OpenCV Benchmark 能够正常调用 GPU,测试结果 PASS ### 测试说明 本次测试中,Debian官方OpenCV GPU Benchmark测得GPU加速比约 **608.92×,** 需要说明的是,该测试程序仅使用OpenCV的 **cv::multiply()** 单一算子进行性能验证,属于OpenCL基础功能验证,其计算量较小,GPU计算耗时接近测试计时精度,因此得到的加速比明显偏高。 因此,本次Benchmark结果主要用于验证OpenCV能够成功调用GPU完成OpenCL计算,不建议将 **608.92×** 作为GPU综合性能指标。 ## 常见问题 ### 设备界面卡顿、掉帧? - 先确认是否后台运行了过多应用,关闭不用的程序 - 若设备发热严重,等待降温后频率会自动恢复 ### 屏幕花屏、显示异常? - 检查 HDMI 线/屏幕连接是否牢固 - 确认屏幕或显示器的分辨率、刷新率设置是否正确 - 更换线材或显示器测试,排除硬件问题 - 若为新接入的 LCD 屏,需确认屏幕规格与设备支持的分辨率匹配 ### 运行大型游戏或 3D 应用崩溃? - 该设备 GPU 为入门级,超高负载应用可能出现性能不足 - 尝试降低游戏画质/分辨率设置 - 保持设备散热良好(避免覆盖、遮挡) ### GPU 发热、耗电快? - 高负载运行时发热属正常现象,系统会自动降频保护 - 检查是否有应用持续占用 GPU(如后台视频、动画)