简介
- 软件工程相关学习笔记
在Windows下C++项目中,如果遇到编译速度较慢的问题,可以使用以下工具来监控和分析问题,帮助优化编译速度:
Clang Build Analyzer
Clang 提供的工具,可以帮助分析编译时间瓶颈。虽然它主要针对Clang编译器,但如果项目使用Clang编译,可以直接使用此工具。
MSBuild Binary and Structured Log Viewer
如果你的项目使用MSBuild构建,可以通过MSBuild日志工具查看具体的构建时间段。
Include What You Use (IWYU)
用于分析C++项目中头文件的依赖情况,减少不必要的头文件包含。
Visual Studio 编译依赖分析器
如果使用Visual Studio,可以通过“项目属性”中的编译依赖设置来分析和优化头文件的使用。
CMake Timing Tools
如果使用CMake作为构建系统,可以通过 --trace
和 --trace-expand
参数分析配置时间。还可以开启构建性能统计(例如 Ninja
提供的构建时间统计)。
IncrediBuild
专为Windows环境设计的分布式构建工具,可大幅加速编译过程。
ccache
高效的编译缓存工具,用于加速重复编译。
Windows Performance Analyzer (WPA)
使用Windows自带的性能分析工具监控磁盘、CPU和内存等资源使用情况,定位瓶颈是否由系统资源导致。
Process Monitor (ProcMon)
监控构建过程中文件系统和进程的读写操作,定位慢点是否由磁盘I/O引起。
Precompiled Headers (PCH)
利用预编译头减少重复的头文件解析时间。
Ninja
替代传统的构建工具(如MSBuild或Make),以更快的依赖管理和任务调度提升编译速度。
Clang-Tidy
通过静态分析工具检查代码质量,识别可能导致编译变慢的代码模式。
可以从头文件优化、构建工具、分布式构建和编译缓存等方面入手。推荐先使用IWYU
和Clang Build Analyzer
分析依赖,再结合ccache
和Ninja
等工具优化构建流程。
ov::Output
是 OpenVINO 中的一个核心类,用于表示模型图中节点的输出。它封装了一个节点的输出端口,允许用户访问输出的形状、数据类型以及与其他节点的连接信息。通过 ov::Output
,可以在计算图中导航并操作节点间的连接。
表示节点的输出端口
每个 ov::Node
可能有一个或多个输出端口,ov::Output
表示其中一个端口。
获取元信息
包括输出的形状、数据类型和元素类型等。
管理连接关系
用于查看输出与哪些节点的输入相连接。
支持模板化ov::Output<T>
可以作用于不同类型的节点,例如 ov::Node
或 ov::Function
。
ov::Output
通常,ov::Output
是从 ov::Node
的 outputs()
方法或 output(i)
方法获取的,而不是直接创建。
1 | // 获取节点的第一个输出 |
以下是 ov::Output
的常用方法及其功能:
1 | ov::Shape shape = output.get_shape(); |
ov::Shape
)。1 | ov::element::Type type = output.get_element_type(); |
f32
、i32
等)。1 | if (output.get_partial_shape().is_dynamic()) { |
get_partial_shape()
检查是否为动态形状。1 | for (const auto& target_input : output.get_target_inputs()) { |
get_target_inputs()
返回所有连接到该输出的输入端口。1 | auto owner_node = output.get_node(); |
get_node()
返回该输出所属的节点。1 | output.set_names({"custom_output_name"}); |
通过 ov::Output
,可以修改计算图中节点的连接关系。
1 | ov::Output<ov::Node> new_output = some_other_node->output(0); |
可以将一个输出连接到多个输入节点:
1 | output.add_target_input(new_node->input(0)); |
以下示例展示了如何遍历模型节点的输出,并动态修改模型:
1 | #include <openvino/openvino.hpp> |
对于动态形状的输出,可以进一步设置具体形状:
1 | if (output.get_partial_shape().is_dynamic()) { |
获取动态形状的约束:
1 | ov::PartialShape partial_shape = output.get_partial_shape(); |
批量操作
尽量减少对输出的逐个操作,使用批量方法操作多个节点或输出。
减少拷贝
使用引用或共享机制避免不必要的输出数据拷贝。
动态形状处理
在动态模型中,尽量在推理开始前明确所有动态形状。
动态形状的操作限制
对动态形状的输出操作时,需要先设置具体形状,否则部分操作可能失败。
数据类型不匹配
在连接节点时,确保输出和输入的数据类型一致。
输出未连接
如果某些输出未连接,可能导致模型推理失败或结果异常。
ov::Output
是 OpenVINO 图操作中的关键类,用于表示和管理节点的输出端口。通过 ov::Output
,开发者可以轻松获取输出的元信息,管理节点间的连接关系,并动态修改计算图。熟练掌握 ov::Output
的功能,可以大大提升在 OpenVINO 图操作中的开发效率。