1 介绍:

NVTX 是一种基于 C/C++ 的 API,用于标注程序中的代码范围、事件和资源。此标注支持在应用程序运行时收集更多信息,这些信息可用于在分析CUDA代码时改进数据呈现。

2 使用

2.1 引用头文件

1
2
#include <nvtx3/nvtx3.hpp>//C++,有可能没有安装上,直接用c的就行。
#include <nvtx3/nvToolsExt.h>//C

2.2 常用功能

2.2.1 范围描述

nvtx3::scoped_range: 用于标记该类所创建对象存在的时间段,传递区间的名字进行初始化。

1
2
3
4
5
6
7
void some_function() {
nvtx3::scoped_range r{"some_function"};//对象r的存在域是some_function()
for(int i = 0; i < 6; ++i) {
nvtx3::scoped_range loop{"loop range"};//对象loop存在的域是for循环的每个轮次。
std::this_thread::sleep_for(std::chrono::seconds{1});
}
}

​​

nvtxRange:nvtxRang: 通过使用nvtxRangePushA( )和nvtxRangePop( )手动标记。

1
2
3
4
5
6
7
8
9
 void my_function(...) {

nvtxRangePushA("my_function"); // 区间开始位置

//

nvtxRangePop(); // 区间结束位置

}

2.2.2 标记事件点

nvtx3::mark:

1
2
3
4
bool success = do_operation(...);
if (!success) {
nvtx3::mark("operation failed!");
}

2.3 实际使用

插桩后会的影响代码性能,因此应当只在需要的时候对相关代码进行编译。可以宏对代码进行控制。

1
2
3
4

#ifdef NVTX
//相关命令
#endif

然后再cmake 中添加相应的控制指令

1
2
3
4

if(NVTX)
add_definitions(-DNVTX)
ENDIF()

在执行编译时添加参数。

1
2
cmake -D NVTX=1 ..
make

3 问题

如果没有nvtx3.hpp,可以从NVTX/c/include/nvtx3 at release-v3 · NVIDIA/NVTX (github.com)中下载,添加到 /usr/local/cuda-12.3/include/nvtx3 目录下即可。

参考文献

[1]CUDA Pro Tip: Generate Custom Application Profile Timelines with NVTX[EB/OL]//NVIDIA Technical Blog. (2013-09-04)[2024-09-11]. https://developer.nvidia.com/blog/cuda-pro-tip-generate-custom-application-profile-timelines-nvtx/.

[2]NVIDIA/NVTX[CP/OL]. NVIDIA Corporation, 2024[2024-09-11]. https://github.com/NVIDIA/NVTX.

[3]NVTX C++ API Reference: NVTX C++ API Reference[EB/OL]. [2024-09-11]. https://nvidia.github.io/NVTX/doxygen-cpp/index.html.