本文记录使用命令 OHOS_ARCH=aarch64 OHOS_ABI=arm64-v8a sh ./create-hnp.sh 构建 Vkpeak 20250531 的完整过程,包括环境、构建链路、关键日志、常见问题与解决方案、产物验证与重建方法,便于复现与运维。
📖 Vkpeak 简介
Vkpeak 是一个 Vulkan 峰值性能测试工具,用于评估 Vulkan GPU 的峰值性能。它通过执行各种 Vulkan 操作(如缓冲区填充、着色器运行等)来测试 GPU 的最大性能,帮助开发者了解设备的 Vulkan 性能上限。
🎯 Vkpeak 的作用与重要性
Vkpeak 是 Vulkan 性能测试的核心工具,提供了:
- 峰值性能测试:测试 Vulkan GPU 的峰值性能
- 性能基准:提供性能基准测试结果
- GPU 评估:评估 GPU 的计算和图形性能
- 性能对比:对比不同设备的 Vulkan 性能
- 优化参考:为应用优化提供性能参考
🔧 Vkpeak 核心特性
1. Vulkan 性能测试
- 缓冲区操作:测试缓冲区填充和传输性能
- 着色器执行:测试着色器执行性能
- 计算性能:测试 GPU 计算性能
- 图形性能:测试 GPU 图形渲染性能
- 内存带宽:测试 GPU 内存带宽
2. 测试模式
- 峰值测试:测试 GPU 的峰值性能
- 持续测试:持续运行性能测试
- 压力测试:进行压力测试以评估稳定性
- 基准测试:运行标准基准测试
3. 结果输出
- 性能指标:输出详细的性能指标
- 性能报告:生成性能测试报告
- 对比分析:对比不同测试结果
- 可视化:支持结果可视化
4. 应用场景
- GPU 性能评估:评估 GPU 的 Vulkan 性能
- 性能基准:建立性能基准测试
- 设备对比:对比不同设备的性能
- 优化参考:为应用优化提供参考
- 驱动测试:测试 Vulkan 驱动性能
🚀 构建入口与环境
- 📝 执行命令:
OHOS_ARCH=aarch64 OHOS_ABI=arm64-v8a sh ./create-hnp.sh - 🔧 入口脚本:
create-hnp.sh- 检查必需的环境变量
OHOS_ARCH和OHOS_ABI - 导出
LC_CTYPE、TOOL_HOME、OHOS_SDK_HOME - 执行
make -C build-hnp
- 检查必需的环境变量
- 📦 顶层构建:
build-hnp/MakefilePKGS变量定义需要构建的包列表(包含vkpeak)- 通过
check-pkgs机制自动检测PKGS变化并触发重新构建 - 自动合并
external-hnp目录下的外部 HNP 包 base.hnp依赖所有包的.stamp和外部 HNP 包- 总目标
all: copy,打包base.hnp并拷贝到entry/hnp/$(OHOS_ABI)
⚙️ Vkpeak 包的构建配置
- 📁 包目录:
build-hnp/vkpeak/Makefile- 继承通用规则:
include ../utils/Makefrag - 源地址:
https://github.com/nihui/vkpeak.git(Git 仓库,分支20250531) - 版本:
20250531
- 继承通用规则:
- ⚙️ CMake 配置参数:
-DCMAKE_SYSTEM_NAME=Linux- 目标系统-DCMAKE_SYSTEM_PROCESSOR=$(OHOS_ARCH)- 目标架构-DCMAKE_C_COMPILER/-DCMAKE_CXX_COMPILER- 交叉编译器-DCPPFLAGS="-I../sysroot/include -D_FORTIFY_SOURCE=2"- 编译预处理标志-DLDFLAGS="-L../sysroot/lib"- 链接标志-DCMAKE_BUILD_TYPE=RelWithDebInfo- 构建类型
- 🔨 构建流程:
- 前置依赖
vulkan-headers - 从 GitHub 克隆源码(使用
git clone -b 20250531 --depth=1 --recursive) - 复制源码到
temp/vkpeak-20250531目录 - 创建
build目录并运行cmake配置 - 使用
make -j $(nproc)并行编译 - 复制
vkpeak二进制到build/bin - 执行 ELF strip 减小体积
- 复制到
../sysroot
- 前置依赖
- 🔧 通用工具链与路径:
build-hnp/utils/MakefragCC/CXX/LD/AR/RANLIB/...均指向 OHOS SDK 的 LLVM 工具链- CMake 通过
CMAKE_C_COMPILER等变量指定交叉编译器
- 📦 依赖关系:
- 前置依赖:
vulkan-headers(Vulkan 头文件,已在sysroot中提供) - 运行时依赖:设备端需要 Vulkan Loader 和驱动支持
- 建议构建顺序:
vulkan-headers → vkpeak
- 前置依赖:
📋 关键日志与过程节点
- 📥 下载与源码准备:
- 从 GitHub 克隆
vkpeak仓库(分支20250531,递归子模块) - 完成克隆并复制到
temp/vkpeak-20250531目录 - 创建
build目录用于 CMake 构建
- 从 GitHub 克隆
- ⚙️ CMake 配置阶段:
- 运行
cmake -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_PROCESSOR=aarch64 ... - 检测 Clang 编译器和 Vulkan 头文件
CMAKE_SYSTEM_NAME=Linux与三元组工具链生效- ABI 与编译特性探测通过
- Vulkan 支持检测成功
- 配置成功,生成
Makefile和构建配置
- 运行
- 🔨 编译与安装:
- 使用
make -j $(nproc)并行编译 - 成功编译生成
vkpeak二进制 - 复制到
build/bin目录 - 执行
llvm-strip剥离二进制符号 - 复制到
../sysroot
- 使用
- 📦 打包:
- 完成
base.hnp重打包,拷贝产物到entry/hnp/arm64-v8a/ - Vkpeak 二进制已成功打包到
base.hnp中
- 完成
✅ 产物验证
📦 检查打包文件
ls build-hnp/base.hnp # 应存在
ls entry/hnp/arm64-v8a/*.hnp # 应包含 base.hnp 与 base-public.hnp
🔍 检查二进制文件
# 检查 vkpeak 二进制
ls -lh build-hnp/sysroot/bin/vkpeak
file build-hnp/sysroot/bin/vkpeak

✅ 构建验证结果:
- ✅ Vkpeak 二进制已安装:
bin/vkpeak(2.2M) - 主程序
- ✅ 文件类型:ELF 64-bit LSB pie executable, ARM aarch64
- ✅ 动态链接:interpreter
/lib/ld-musl-aarch64.so.1 - ✅ 已剥离符号:
stripped - ✅ 已打包到
base.hnp中
💻vkpeak使用
vkpeak
vkpeak --profile

🐛 常见问题与处理
❌ 问题 1:Vulkan Loader 缺失
- 🔍 症状:运行时错误,无法加载 Vulkan 库
- 🔎 原因:交叉包提供头与链接;设备端需厂商 Loader 与驱动
- ✅ 解决方法:
- 确保设备端安装了 Vulkan Loader 和驱动
- 可选在后续加入
vulkan-loader构建 - 检查设备是否支持 Vulkan:
vkpeak --check-vulkan - 位置:运行时
❌ 问题 2:编译器探测警告
- 🔍 症状:CMake 配置时出现
project()调用前未cmake_minimum_required()的警告 - 🔎 原因:CMake 版本检查警告,不影响构建
- ✅ 解决方法:
- 警告可忽略,不影响构建
- 如需消除警告,可在 CMakeLists.txt 中添加
cmake_minimum_required() - 位置:
build-hnp/vkpeak/Makefile:8
❌ 问题 3:Git 克隆失败
- 🔍 症状:无法从 GitHub 克隆源码
- 🔎 原因:网络问题或 GitHub 访问受限
- ✅ 解决方法:
- 检查网络连接
- 使用代理或镜像站点
- 手动克隆源码到
build-hnp/vkpeak/download/vkpeak - 位置:
build-hnp/vkpeak/Makefile:17
❌ 问题 4:子模块初始化失败
- 🔍 症状:Git 子模块初始化失败
- 🔎 原因:网络问题或子模块仓库不可访问
- ✅ 解决方法:
- 确保使用
--recursive参数克隆 - 检查子模块仓库是否可访问
- 手动初始化子模块:
git submodule update --init --recursive - 位置:
build-hnp/vkpeak/Makefile:17
- 确保使用
❌ 问题 5:Vulkan 头文件缺失
- 🔍 症状:编译错误,找不到 Vulkan 头文件
- 🔎 原因:
vulkan-headers未安装到sysroot - ✅ 解决方法:
- 确保
vulkan-headers在vkpeak之前构建 - 检查
sysroot/include/vulkan目录是否存在 - 确保编译时添加了
-I../sysroot/include头文件路径 - 位置:
build-hnp/vkpeak/Makefile:8
- 确保
❌ 问题 6:链接失败
- 🔍 症状:链接错误,无法找到 Vulkan 符号
- 🔎 原因:链接时未指定库或库路径不正确
- ✅ 解决方法:
- 确保链接时添加了
-lvulkan(如果使用 Vulkan) - 检查
LD_LIBRARY_PATH是否包含库路径 - 确保编译时添加了
-L../sysroot/lib链接路径 - 位置:编译和链接阶段
- 确保链接时添加了
❌ 问题 7:运行时设备不可用
- 🔍 症状:运行时无法找到 Vulkan 设备
- 🔎 原因:设备端未安装 Vulkan 驱动或驱动不可用
- ✅ 解决方法:
- 确保设备端安装了 Vulkan 驱动
- 检查设备是否支持 Vulkan:
vkpeak --list-devices - 使用
vkpeak --check-vulkan检查 Vulkan 支持 - 位置:运行时
❌ 问题 8:架构不支持
- 🔍 症状:
Unsupported OHOS_ARCH= - 🔎 原因:传入的架构不在支持列表中
- ✅ 解决方法:
- 确保传入支持架构(
aarch64或x86_64) - 位置:
build-hnp/Makefile:1-49
- 确保传入支持架构(
🔄 重建与扩展
-
🔧 重建单包:
make -C build-hnp rebuild-vkpeak # 触发子包重新编译并刷新 .stamp -
🧹 清理:
make -C build-hnp clean # 清理 sysroot、所有 .stamp 和 PKGS_MARKER -
📦 扩展:Vkpeak 是 Vulkan 性能测试的核心工具,被广泛用于 GPU 性能评估和基准测试
-
🔄 自动重建机制:
- 修改
PKGS后,check-pkgs会自动检测变化并触发重新构建 - 新增外部 HNP 包到
external-hnp目录后,会自动合并到base.hnp
- 修改
💡 实践建议
- 🔧 构建配置:根据设备能力选择是否启用 Vulkan 支持
- 🚀 依赖管理:确保
vulkan-headers在 vkpeak 之前构建(如果启用 Vulkan) - 📦 GPU 性能:Vkpeak 为 Vulkan GPU 性能测试提供了强大的工具支持
- 🔗 驱动支持:确保设备端安装了 Vulkan Loader 和驱动
- 🌐 性能基准:使用 Vkpeak 建立性能基准并进行性能对比
📝 结论与建议
- ✅ 本次已在 aarch64 环境下完成 Vkpeak 20250531 的交叉编译与打包,二进制已安装到
sysroot并纳入 HNP 包。 - 💡 为保证构建稳定:
- 确保
vulkan-headers在 vkpeak 之前构建(如果启用 Vulkan) - 使用 CMake 构建系统,配置灵活
- 确保通过
create-hnp.sh触发构建以获得完整环境变量 - 利用
check-pkgs机制自动检测包列表变化,无需手动清理 - Vkpeak 为 Vulkan GPU 性能测试提供了强大的工具支持
- 常见陷阱包括 Vulkan Loader 缺失、编译器探测警告、Git 克隆失败;当前已通过构建配置和参数处理
- 建议确保设备端安装了 Vulkan Loader 和驱动,并使用 Vkpeak 进行性能基准测试
- 已完成 aarch64 目标下 Vkpeak 的交叉编译与打包,工具进入
sysroot并纳入 HNP 包
- 确保
📚 以上为 Vkpeak 构建的深度解读与实践记录。

被折叠的 条评论
为什么被折叠?



